2009-12-11 82 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) 

你可以做一个执行时间检查是否存在,但它会有点凌乱。总的来说,除非你有充分的理由,否则我仍然会选择第一个版本。