gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:38:25 27 4
gpt4 key购买 nike

我有许多引用许多持久性类的 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 构造函数分配(由于 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();
}

或工厂 map

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

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

最佳答案

我会选择第一种形式 - 我非常非常怀疑任何性能差异是否会显着。不过,如果您真的很担心,请衡量差异。

另一种选择是使用枚举:

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

public abstract Object newField();
}

然后将您的枚举值而不是 Class<T> 传递给构造函数.没有反射,没有大的 if/else block ,并且您不会意外地尝试将它与您不支持的类或​​没有公共(public)无参数构造函数的类型一起使用。缺点是您没有编译时预防:

new HtmlForm<PersonInfo>(PersistenceHandler.POSTAL_ADDRESS)

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

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

关于java - 通过泛型参数实例化类——哪种方法更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1886577/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com