我正在使用一个抽象类和该类的一组(不断增长的)子类。由于某些原因,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));
}
最佳答案
those classes can be [...] configured via a configurationfile
在这种情况下,常见的方法就像您的第一个提案:Class.forName("...").newInstance()
(当然,这可以通过某种工厂模式来封装。)
由于在 Java 中,您无法强制子类实现特定的构造函数,因此唯一可行的方法是通过设计指南/契约(Contract)要求默认构造函数。
作为示例,请查看 Android 的 Parcelable :
Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator interface.
关于java - 如何强制执行对象创建的某些方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9111882/