java - 如何强制执行对象创建的某些方法?

标签 java singleton

我正在使用一个抽象类和该类的一组(不断增长的)子类。由于某些原因,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/

相关文章:

java - 如何解决 android studio 中的这个依赖问题?

java - 有人可以解释一下使用 DDA 扫描线给定 3 个顶点绘制三角形的逻辑吗?

c# - 可以在 C# 中使用带有非默认构造函数的单例吗?

ios - 跳过单例对象的初始化?

java - ejb - 调用同一实例的方法时的单例锁定模式?

java - 避免运行两个应用程序的 tomcat 崩溃

java - 坐标之间的距离 - 角度 > 180(处理/Java)

java - 将多个选定值插入表中(oracle)

c++ - 需要帮助来理解单例模式

c++将文件连接返回给成员,因此可以由同一类的其他方法使用