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(),因此 HTMLForm 构造函数将分配愚蠢的SunWontAllowTnewInstance(由于 sun 的泛型体系结构,这是一种愚蠢的必要性),然后稍后使用getPersistenceHandlerClass来获取适当的持久性处理类。

由于云计算按 cpu 小时收费,我的问题是,假设我有大约 25 个持久性类需要处理,那么它会使用更少的 cpu。上面的第一个还是后面的?

 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();
 }

或者就我应该如何克服 java 泛型缺点提出更好的建议(考虑 cpu 消耗),以另一种从参数 T 实例化的方法。(或者批评我为什么我过于兴奋地批评 sun 的泛型参数缺点)。

4

1 回答 1

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)

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

总的来说,除非您有充分的理由不这样做,否则我仍然会选择第一个版本。

于 2009-12-11T08:32:41.990 回答