我有类似的东西:
interface Options {
fun load(conf: JsonObject)
}
object BasicOptions : Options { }
object PersonOptions : Options { }
object CarOptions : Options { }
然后我想获得所有实现选项Objects
并调用负载interface
的{{1}}。
forEach
答案 0 :(得分:0)
语言不支持此功能,这就是为什么有依赖注入,注册表或服务查找解决方案的原因。
另一种方法是使用自定义类加载器并添加此自定义功能。最简单的方法可能是使用Reflections库来扫描和加载这些类。例如:
val reflections = Reflections("my.project.prefix")
val allClasses = reflections.getSubTypesOf(Options::class.java)
最简单,最常用的解决方案就是维护自己的“注册表”,例如包含所有实例列表的静态对象。它将需要手动添加任何实现该接口的新类-但它将是简单,高效且健壮的解决方案。
答案 1 :(得分:0)
您始终可以使用Factory
模式来创建Options
的新实例,这样就可以拥有自己的OptionsFactory
和缓存机制。
实例化对象后,OptionsFactory
会将其保留在缓存中(可以是内存缓存或DB..etc),然后随时可以在需要时向工厂询问其缓存实例。
在运行时/根据需要创建Options
对象时,这样做会更好。
答案 2 :(得分:0)
当然可以!
使用 Reflections 库非常简单:
首先,您需要找到所有实现“Objects”接口的java 类。然后将 java 类转换为 kotlin 类(KClass)。
KClass 具有属性 objectInstance,如果该类没有对象实例,则该属性为 null...否则是 singleton 对象实例。
所以:
val reflections = Reflections(ConfigurationBuilder())
val jList = reflections.getSubTypesOf(Options::class.java)
val kList = jList.map { it.kotlin }
val oList = kList.map { it.objectInstance }.filterNotNull()
;-)