kotlin - 科特林。我可以获得所有实现特定接口的对象吗
问题描述
我有类似的东西:
interface Options {
fun load(conf: JsonObject)
}
object BasicOptions : Options { }
object PersonOptions : Options { }
object CarOptions : Options { }
然后我想获得所有Objects
实现 Optionsinterface
并调用 load forEach
。
fun main(args: Array) {
configFuture.whenComplete { config ->
options.forEach { it.load(config) }
}
}
解决方案
语言不支持这一点,这就是存在依赖注入、注册表或服务查找解决方案的原因。
- 如果所有对象都在依赖注入框架中注册,您可能能够迭代所有注册到框架的对象并找到您的接口实例。
- 这可能是相当低效的 - 所以缓存结果以避免额外的开销。
另一种方法是使用自定义类加载器并添加此自定义功能。最简单的方法可能是使用Reflections库来扫描和加载这些类。例如:
val reflections = Reflections("my.project.prefix") val allClasses = reflections.getSubTypesOf(Options::class.java)
最简单、最常用的解决方案是简单地维护您自己的“注册表”,例如保存所有实例列表的静态对象。它将需要手动添加任何实现该接口的新类——但这将是一个简单、高效且健壮的解决方案。
推荐阅读
- hyperledger-fabric - HL Fabric 2.0,外部链码启动器:模拟错误:执行交易失败:无法启动链码
- ajax - PHP twig foreach Bootstrap Modal 需要帮助
- html - 'mat-slide-toggle' 在导入后不是已知元素
- python - google colab 的根目录中缺少 datalab 文件夹
- angular - Angular:用于 switch 与 dict 查找
- c# - WPF ListView GridView 单元格样式和绑定
- netsuite - 为什么只有一个用户收到 302 状态码?
- css - 根据屏幕大小渲染组件或渲染嵌入的视频 src
- unity3d - 如何在导航网格中将玩家从一个网格移动到另一个网格
- arrays - 在工作表 1 中使用 2 列中的 FROM 和 TO 日期搜索特定日期,然后将工作表 1 中同一行中的列中的数据粘贴到工作表 2