我有一个类Main.java
,需要在其中实例化一堆其他类,例如C1.java
... C50.java
。我无法想到一种优雅的方法来实例化Main类中的这50个类。如果我只是将所有实例化代码放在一个地方,那么看起来就很拥挤和丑陋。今天我有50
类要实例化,明天这个计数可以增加到100
,那么这种情况会变得更糟。您能否提出一种优雅的实例化所有这些类的方法,而又不致使Main类挤满实例化代码。我不知道有任何设计模式可以做到这一点。
我正在考虑创建一个需要实例化的类的数组,并使用反射实例化它们。
答案 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的模块系统时建立必要的访问权限。