我有许多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.(或者批评我为什么我太过于批评太阳的通用参数缺点)。
答案 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)
您可以对此进行执行时间检查,但这会有些混乱。
总的来说,除非你有充分的理由不去,否则我仍会选择第一个版本。