为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕妹3146593 2022-11-30 10:54:32
我有一个类,我需要在其中实例化Main.java一堆其他类说C1.java......。C50.java我想不出一种优雅的方法来在主类中实例化这 50 个类。如果我只是将所有实例化代码放在一个地方,它看起来会非常拥挤和丑陋。今天我有50类要实例化,明天这个计数可以增加到100,然后这种情况会变得更糟。您能否建议一种优雅的方法来实例化所有这些类,而不会使 Main 类充满实例化代码。我不知道有任何设计模式可以做到这一点。我正在考虑创建一个需要实例化的类数组,并使用反射来实例化它们。
查看完整描述

2 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

答案取决于课程的用途。但是,如果您不介意以实例化类的无序集合结束,可以使用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());

}

无论如何,整个设计都应该重新考虑。


查看完整回答
反对 回复 2022-11-30
?
墨色风雨

TA贡献1853条经验 获得超6个赞

推荐的解决方案是使用服务加载器架构

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

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

为了使这项工作有效,仅实现接口是不够的,必须将这些实现声明为服务提供者,要么通过META-INF/services/jar 文件中的条目(如链接类文档中所述),要么通过providesJava 模块声明中的声明,当使用 Java 9 或更新版本。

这样做的好处不仅是更高的性能,与使用反射库搜索整个类路径相比,它还确保在将来使用 Java 的模块系统时建立必要的访问权限。

另请参阅Java 9 版本的类文档


查看完整回答
反对 回复 2022-11-30
  • 2 回答
  • 0 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信