通过泛型参数实例化类 - 哪种方法更好

时间:2009-12-11 08:15:55

标签: java generics parameters instantiation

我有许多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(),HTMLForm构造函数会分配 stupidSunWontAllowTnewInstance (由于sun的泛型架构而傻了),然后 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.(或者批评我为什么我太过于批评太阳的通用参数缺点)。

1 个答案:

答案 0 :(得分: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)

您可以对此进行执行时间检查,但这会有些混乱。

总的来说,除非你有充分的理由不去,否则我仍会选择第一个版本。