从类

时间:2015-12-30 14:49:22

标签: java

我目前正在编写一个库,用户可以在其中创建父抽象类Module的子类。 所以该库已经包含了我编写的一些模块,例如ModuleOneModuleTwo,...

每个Module - 子类应该可以使用唯一标识符轻松识别,例如整数,因为我想在xml文件中保存多个模块配置和连接。 所以我可以稍后加载保存的配置并实例化所需类型的对象。

如果我只使用预定义的类,这很容易,因为我知道ModuleOneModuleTwo的标识符,所以我可以在函数中创建模块:

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()中创建模块,因为我不知道它们的构造函数及其标识符。

感谢您的帮助。

2 个答案:

答案 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();