我正在使用这个类的抽象类和(不断增长的)子类集。由于某些原因,A的所有子类都应该实现单例模式。在启动应用程序期间,存在List<Class<? extends A>>
,我想初始化所有单例实例。
从我看到的,我的选择是去反思,通过指导强制执行所有A实现类必须有一个定义的构造函数并通过o.getDeclaredConstructor().newInstance();
调用它。
我还尝试了一种不同的方法,我使用了静态方法的重载。也就是说,A定义了一个静态initialize
方法,所有子类都必须重新实现该方法。可以通过反射再次调用该调用。
第一种方法的明显缺点是违反编程指南只会导致运行时错误,而不会导致编译时错误。第二个更糟糕的是,如果子类没有实现静态方法,则只调用A
中的方法,不会抛出明显的异常。
那么:如何在一组单例类中强制执行统一的初始化方法?
编辑:
配置类在启动期间生成A
的所有子节点的列表,这些类可以通过编程方式直接在配置类中注册,也可以通过配置文件进行配置:
private void initModules() {
Configurator.addModule("modulename", SubOfA.class);
...
}
private void initModuleFile() {
...
String name = in.readLine();
String classname = ...;
String modulename = ...;
Configurator.addModule(modulename, Class.forName(classname));
}
答案 0 :(得分:1)
可以通过配置文件
配置这些类
在这种情况下,常见方法就像您的第一个提案:Class.forName("...").newInstance()
(当然,这可以通过某种工厂模式进行封装。)
因为在Java中,你不能强制要求子类实现特定的构造函数,唯一可行的方法是按设计指南/合同要求默认构造函数。
举个例子,看看Android的Parcelable:
实现Parcelable接口的类也必须具有静态 字段名为CREATOR,它是一个实现的对象 Parcelable.Creator界面。