科特林我可以获取实现特定接口的所有对象吗?

时间:2018-09-30 00:23:18

标签: kotlin

我有类似的东西:

interface Options {
    fun load(conf: JsonObject)
}

object BasicOptions : Options { }
object PersonOptions : Options { }
object CarOptions : Options { }

然后我想获得所有实现选项Objects并调用负载interface的{​​{1}}。

forEach

3 个答案:

答案 0 :(得分:0)

语言不支持此功能,这就是为什么有依赖注入,注册表或服务查找解决方案的原因。

  • 如果所有对象都在依赖注入框架中注册,则可以迭代所有已注册到该框架的对象,并找到Interface的实例。
    • 这可能效率很低-请缓存结果以避免额外的开销。
  • 另一种方法是使用自定义类加载器并添加此自定义功能。最简单的方法可能是使用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()

;-)