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

时间:2012-02-02 11:55:52

标签: 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));
}

1 个答案:

答案 0 :(得分:1)

  

可以通过配置文件

配置这些类

在这种情况下,常见方法就像您的第一个提案:Class.forName("...").newInstance()

(当然,这可以通过某种工厂模式进行封装。)

因为在Java中,你不能强制要求子类实现特定的构造函数,唯一可行的方法是按设计指南/合同要求默认构造函数。

举个例子,看看Android的Parcelable

  

实现Parcelable接口的类也必须具有静态   字段名为CREATOR,它是一个实现的对象   Parcelable.Creator界面。