2014-08-28 139 views
0

我有一個基類。POJO中的泛型 - 這是一個很好的做法

@Data 
class BaseDocument{ 
    String id; 
    String name; 
    //Other fields 
} 

說我有很多類擴展BaseDocument一個下面。

class NoteDocument extends BaseDocument{ 
    String description; 
    Long lastModifiedDate; 
    //etc 
} 

在某些情況下將整個文檔發送到UI是沒有意義的。大多數情況下,我只需要id和名稱。 因此,對於每個文檔,我都有一個VO類。

@Data 
class BaseVO { 
    private String id; 
    private String name; 
} 

@Data 
class NoteVO extends BaseVO{ 
    //Nothing here now 

} 

並且在NoteDocument中有。

public NoteVO getVo(){ 
     Assert.notNull(getId()); 
     NoteVO noteVo = new NoteVO(); 
     noteVo.setName(getName()); 
     noteVo.setId(getId()); 
     return noteVo; 
    } 

現在我必須在擴展BaseDocument的所有類中複製此方法。

相反,我改變了我的BaseDocument,如下所示。

@Data 
    class BaseDocument<V extends BaseVO>{ 
     String id; 
     String name; 

     public V getVo(Class className) { 
      Assert.notNull(getId()); 
      V vo = null; 
      try { 
       vo = (V) className.newInstance(); 
       vo.setName(getName()); 
       vo.setId(getId()); 
      } catch (IllegalAccessException|InstantiationException e){ 
       e.printStackTrace(); 
      } 
      Assert.notNull(vo); 
      return vo; 
     } 

    } 

我是新來的仿製藥。我的第一個問題是,這是一個很好的做法。使用反射創建實例時是否有任何問題,性能問題?有沒有更好的方法來實現(編寫更少的代碼)。

編輯:假設我需要在用戶界面中顯示筆記,除了筆記我還需要顯示創建筆記的用戶名。我使用的是mongodb,當我保存該筆記時,我還將UserVO保存在筆記中,該筆記將具有用戶標識和用戶名稱。如果我在保存筆記時僅保存用戶標識,則需要在顯示時再進行一次查詢以獲取用戶名。我想避免這種情況。

+0

是的。 java反射很昂貴。你不能寫工廠來創建對象嗎? – Adi 2014-08-28 14:46:36

+0

我絕對不會考慮這個好做法。如果你使用反射來構建一個簡單的對象,這是一個好兆頭,你需要回到繪圖板。不過,我認爲這不太可能是性能問題,但這實際上取決於您創建這些對象的頻率。對我而言,可讀性是這裏重要的關注點。 無論如何,VO課程的目的是什麼?爲什麼不設計一個定義UI需求的類/接口,然後用不同的文檔類型來實現它。或者,也許我誤解了你。 – 2014-08-28 15:19:39

+1

@MikkelK。我編輯了答案,希望我能傳達正在嘗試做的事情。 – titogeo 2014-08-28 17:47:23

回答

0

請勿使用反射;可以使用繼承,也可以使用協變返回類型。它會更快,更清晰,更精確,更易於維護。您也可能會發現添加方法以遞增方式填充您的VO非常有用。我沒有想出一個簡單的方法來將泛型應用於這種情況,但我不認爲你需要它們:

class BaseVO { 
    String id; 
    String name; 

    void setId(String id) { 
     this.id = id; 
    } 

    void setName(String name) { 
     this.name = name; 
    } 
} 

class NoteVO extends BaseVO { 
    // ... 
} 

@Data 
class BaseDocument { 
    String id; 
    String name; 
    //Other fields 

    protected void populateBaseVO(BaseVO vo) { 
     vo.setId(id); 
     vo.setName(name); 
    } 

    public BaseVO getVO() { 
     BaseVO vo = new BaseVO(); 

     populateBaseVO(vo); 
     return vo; 
    } 
} 

@Data 
class NoteDocument extends BaseDocument { 
    String description; 
    Long lastModifiedDate; 
    // .... 

    protected void populateNoteVO(NoteVO vo) { 
     populateBaseVO(vo); 
     // ... 
    } 

    public NoteVO getVO() { 
     NoteVO vo = new NoteVO(); 

     populateNoteVO(vo); 
     return vo; 
    } 
} 
相關問題