我有类似的东西:

interface Options {
    fun load(conf: JsonObject)
}

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

然后我想获得所有实现选项Objectsinterface并调用load forEach
fun main(args: Array) {
    configFuture.whenComplete { config ->
            options.forEach { it.load(config) }
    }
}

最佳答案

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

  • 如果所有对象都已在依赖注入(inject)框架中注册,则可以迭代所有已注册到该框架的对象并找到Interface的实例。
  • 这可能效率很低-因此请缓存结果以避免额外的开销。
  • 另一种方法是使用自定义类加载器并添加此自定义功能。最简单的方法可能是使用Reflections库来扫描和加载这些类。例如。:
    val reflections = Reflections("my.project.prefix")
    val allClasses = reflections.getSubTypesOf(Options::class.java)
    
  • 最简单,最常用的解决方案就是维护自己的“注册表”,例如包含所有实例列表的静态对象。它将需要手动添加任何实现该接口(interface)的新类-但它将是简单,高效且健壮的解决方案。
  • 关于kotlin - Kotlin 。我可以获取实现特定接口(interface)的所有对象吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52573605/

    10-12 04:01
    查看更多