gpt4 book ai didi

java - 基于命令行参数创建子类对象的最佳方法

转载 作者:行者123 更新时间:2023-12-01 13:18:21 24 4
gpt4 key购买 nike

我有几个扩展父类(super class)的子类,我想让命令行界面用户选择要使用的子类。所有子类都具有相同的构造函数形式。

例如,我希望能够调用run --subclass=Subclass1 ,导致调用Subclass obj = new Subclass(arg1, arg2) 。我可以想到几种方法来做到这一点,但我认为这种模式经常出现,因此有一个标准或公认的方法来做到这一点;如果没有,我想做最优雅、最简单的事情。

这是我当前的建议(假设有一个 Namespace 对象包含命令行参数):

SuperClass createObject(Namespace namespace, 
ArgumentClass1 arg1,
ArgumentClass2 arg2) throws Exception {
Map<String, Class<? extends SuperClass>> classMap =
ImmutableMap.<String, Class<? extends SuperClass>>builder()
.put("subclass1", SubClass1.class)
.put("subclass2", SubClass2.class)
.build();
Constructor<? extends SuperClass> constructor =
classMap.get(namespace.getString("subclass"))
.getConstructor(ArgumentClass1.class, ArgumentClass2.class);
return constructor.newInstance(arg1, arg2);
}

当子类构造函数全部不带参数时,可以通过不使用 Constructor 来简化这一点并在做return classMap.get(namespace.get("subclass")).newInstance(); 。请注意,一个缺点是这可能会引发需要在此处或上游处理的几个异常之一( InstantiationExceptionIllegalAccessExceptionNoSuchMethodExceptionInvocationTargetException )。

这样合理吗?这是最好的方法吗?有可以使用的标准模式吗?

最佳答案

我建议为每个子类创建一个工厂类,并将这些工厂的实例放入您的classMap中。这将帮助您避免反射(并且性能可能更好)。

SuperClass createObject(Namespace namespace, 
ArgumentClass1 arg1,
ArgumentClass2 arg2) throws Exception {
Map<String, SubClassFactory> classMap = ImmutableMap.<String, SubClassFactory>builder()
.put("subclass1", new SubClassFactory1())
.put("subclass2", new SubClassFactory2())
.build();
return classMap.get(namespace.getString("subclass")).newInstance(arg1, arg2);
}

PS:如果每个 java 运行时只需要一个实例,那么这些 SubClassFactory 也可以是枚举。

关于java - 基于命令行参数创建子类对象的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22274468/

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