我目前正在编写一个库,用户可以在其中创建父抽象类Module
的子类。
所以该库已经包含了我编写的一些模块,例如ModuleOne
,ModuleTwo
,...
每个Module
- 子类应该可以使用唯一标识符轻松识别,例如整数,因为我想在xml文件中保存多个模块配置和连接。
所以我可以稍后加载保存的配置并实例化所需类型的对象。
如果我只使用预定义的类,这很容易,因为我知道ModuleOne
或ModuleTwo
的标识符,所以我可以在函数中创建模块:
public static Module getModuleByType(int type)
{
if (type == ModuleOne.TYPE)
return new ModuleOne();
else if (type == ModuleTwo.TYPE)
return new ModuleTwo();
//and so on...
}
但是如果用户创建Module
的子类,例如CustomModule
,我该如何为此类分配唯一标识符,以便此类的所有实例具有相同的类型标识符?
如何从标识符动态重新创建这些模块?所以我无法在getModuleByType()
中创建模块,因为我不知道它们的构造函数及其标识符。
感谢您的帮助。
答案 0 :(得分:2)
我认为这不是一个好的设计。如何确保子类不重用已使用的类型?如果有人已经拥有自己的子类及其唯一标识符,然后导入另一个库并发现它们有重复的标识符,该怎么办?您的设计容易出现多个错误。
一般来说,你不可能做这样的事情,因为子类可能与其父类有很大不同。
如果你不知道他们的构造函数,你永远不能实例化它们,因为你不知道它们的构造函数的参数是什么意思。
一个相对有用的解决方案是“强制”子类有一个特定的构造函数,比方说no-arg构造函数,然后你可以执行以下操作:
System.out.println(
"DATETIME = "
+ utc.format(DateTimeFormatter.ofPattern("MM/dd/uuuu h:mm:ss a xxx")));
// output: DATETIME = 12/30/2015 3:14:50 PM +00:00
虽然这比直接执行public static Module getModuleByType(final Class<? extends Module> moduleSubClass) {
Constructor<? extends Module> ctor = moduleSubClass.getConstructor();
return ctor.newInstance();
}
要慢,但你强迫所有子类都有一个no-arg构造函数。
答案 1 :(得分:1)
您可以使用完整的类名(包含)作为标识符,并使用此
重新创建它Class<?> clazz = Class.forName(className);
Module module = (Module)clazz.newInstance();