2009-12-11 71 views
2

我有許多引用許多持久化類的html表單。通過泛型參數實例化類 - 哪種方法更好

所有HTML形式是通過一個單一的類HtmlForm控件生成通過使在相應HTMLFields實例:

public class HTMLForm<T>{ 
HTMLForm(HTMLFields[] f, Class<T> classt){ 
    this.stupidSunWontAllowTnewInstance = classt; 

    // ... whatever GWT jazz .... 
} 

public T getPersistenceHandlerClass(){ 
    try{ 
    return (T) stupidSunWontAllowTnewInstance.newInstance(); 
    } 
    catch (InstantiationException e){} 
    catch (IllegalAccessException e){} 
} 

Class<T> stupidSunWontAllowTnewInstance; 
} 

HtmlForm控件着眼於HTMLFields []數組產生相應的HTML形式。因此,每一組HTMLFields []數組都需要不同的持久性類。持久化類是像

PostalAddr, PersonInfo, ItemDescr, Preferences, etc, etc. 

現在,因爲我不能做T.newInstance(),stupidSunWontAllowTnewInstance將被分配(一個愚蠢的必要性,由於仿製藥的太陽的體系結構)由HtmlForm控件構造函數,然後getPersistenceHandlerClass是稍後用於獲取適當的持久性處理類。

由於雲計算由CPU時間收費,我的問題是,這將使用較少的CPU,假設我有大約25個持久類來趟。上面的第一個或後面的一個?

public T getPersistenceHandlerClass(){ 
    if (stupidSunWontAllowTnewInstance == PostalAddress.class) 
    return new PostalAddress(); 
    if (stupidSunWontAllowTnewInstance == PersonInfo.class) 
    return new PersonInfo(); 

    if (stupidSunWontAllowTnewInstance == .... 
    .... 
    .... 

    if (stupidSunWontAllowTnewInstance == etc.class) 
    return new etc(); 
} 

或地圖工廠

public static Map<PersistenceHandlerFactoryInterface> PHFactories; 
public T getPersistenceHandlerClass(){ 
    return 
    PHFactories.get(stupidSunWontAllowTnewInstance).createInstance(); 
} 

或做一個更好的建議(與CPU消耗的考慮),我應該如何克服Java泛型的缺點,另一種方式從參數T實例化的(或者批評我爲什麼太太太批評太陽的一般參數缺點)。

+0

批評java泛型是當今常見的一種運動,所以不要期望對其進行批評:) – Bozho 2009-12-11 08:19:50

+1

對Java泛型的批評很好,但我建議你最好用更體貼和更少挑釁的方式來做。 – 2009-12-11 08:30:47

+0

順便說一句,我正在使用vaadin。 – 2009-12-11 08:45:52

回答

4

我會用第一種形式 - 我非常很懷疑任何性能差異將是重大的。如果你真的很擔心它,測量的區別。

另一種方法是使用一個枚舉:

public enum PersistenceHandlerFactory 
{ 
    POSTAL_ADDRESS 
    { 
     @Override Object newField() 
     { 
      return new PostalAddress(); 
     } 
    }, 
    ...; 

    public abstract Object newField(); 
} 

那麼你的枚舉值傳遞到構造函數,而不是Class<T>。沒有反射,沒有大的if/else塊,並且你不會意外地試圖將它用於你不支持的類或​​沒有公共無參數構造函數的類型。缺點是,你不必編譯時預防:

new HtmlForm<PersonInfo>(PersistenceHandler.POSTAL_ADDRESS) 

你可以做一個執行時間檢查是否存在,但它會有點凌亂。總的來說,除非你有充分的理由,否則我仍然會選擇第一個版本。