我有一個基類。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保存在筆記中,該筆記將具有用戶標識和用戶名稱。如果我在保存筆記時僅保存用戶標識,則需要在顯示時再進行一次查詢以獲取用戶名。我想避免這種情況。
是的。 java反射很昂貴。你不能寫工廠來創建對象嗎? – Adi 2014-08-28 14:46:36
我絕對不會考慮這個好做法。如果你使用反射來構建一個簡單的對象,這是一個好兆頭,你需要回到繪圖板。不過,我認爲這不太可能是性能問題,但這實際上取決於您創建這些對象的頻率。對我而言,可讀性是這裏重要的關注點。 無論如何,VO課程的目的是什麼?爲什麼不設計一個定義UI需求的類/接口,然後用不同的文檔類型來實現它。或者,也許我誤解了你。 – 2014-08-28 15:19:39
@MikkelK。我編輯了答案,希望我能傳達正在嘗試做的事情。 – titogeo 2014-08-28 17:47:23