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

Ale*_*zel 5 kotlin

我有类似的东西:

interface Options {
    fun load(conf: JsonObject)
}

object BasicOptions : Options { }
object PersonOptions : Options { }
object CarOptions : Options { }
Run Code Online (Sandbox Code Playgroud)

然后我想获取所有Objects实现 Optionsinterface并调用 load 的内容forEach

fun main(args: Array) {
    configFuture.whenComplete { config ->
            options.forEach { it.load(config) }
    }
}
Run Code Online (Sandbox Code Playgroud)

Lio*_*-On 3

该语言不支持这一点,这就是为什么有依赖注入、注册表或服务查找解决方案。

  • 如果所有对象都在依赖注入框架中注册,您也许能够迭代注册到框架的所有对象并找到接口的实例。
    • 这可能效率相当低——因此缓存结果以避免额外的开销。
  • 另一种方法是使用自定义类加载器并添加此自定义功能。最简单的方法可能是使用Reflections库来扫描和加载这些类。例如:

    val reflections = Reflections("my.project.prefix")
    val allClasses = reflections.getSubTypesOf(Options::class.java)
    
    Run Code Online (Sandbox Code Playgroud)
  • 最简单、最常用的解决方案就是简单地维护您自己的“注册表”,例如保存所有实例列表的静态对象。它将需要手动添加任何实现该接口的新类 - 但这将是简单、高性能且健壮的解决方案。