一次实例化一堆类的正确方法

时间:2019-05-15 18:29:56

标签: java design-patterns reflection

我有一个类Main.java,需要在其中实例化一堆其他类,例如C1.java ... C50.java。我无法想到一种优雅的方法来实例化Main类中的这50个类。如果我只是将所有实例化代码放在一个地方,那么看起来就很拥挤和丑陋。今天我有50类要实例化,明天这个计数可以增加到100,那么这种情况会变得更糟。您能否提出一种优雅的实例化所有这些类的方法,而又不致使Main类挤满实例化代码。我不知道有任何设计模式可以做到这一点。

我正在考虑创建一个需要实例化的类的数组,并使用反射实例化它们。

2 个答案:

答案 0 :(得分:1)

答案取决于课程的目的。但是,如果您不介意以无序的实例化类集合结尾,则有一种使用Reflections库的方法,而且我想在代码行方面也很短:

// find out all the classes implementing MyInterface
Set<Class<? extends MyInterface>> subTypes = reflections.getSubTypesOf(MyInterface.class);

// iterate those classes and instntinate them
List<MyInterface> objects = new ArrayList<>();
for (Class<? extends MyInterface> clazz: subtypes) {
    objects.add(clazz.newInstance());
}

无论如何,整个设计都应该精打细算。

答案 1 :(得分:0)

推荐的解决方案是使用service loader architecture

实例化MyInterface的所有已注册实现可以简单地完成

for(MyInterface my: ServiceLoader.load(MyInterface.class)) {
    /* do something with <my> */
}

要使其工作正常,仅靠实现接口还不够,必须通过jar文件META-INF/services/中的条目(如链接类文档中所述)将这些实现声明为服务提供者。使用Java 9或更高版本时,通过Java模块声明中的provides声明。

与使用反射库搜索整个类路径相比,此方法不仅具有更高的性能,而且还可以确保将来在使用Java的模块系统时建立必要的访问权限。

另请参阅Java 9’s version of the class documentation