首页 > 解决方案 > 科特林。我可以获得所有实现特定接口的对象吗

问题描述

我有类似的东西:

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) }
    }
}

标签: kotlin

解决方案


语言不支持这一点,这就是存在依赖注入、注册表或服务查找解决方案的原因。

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

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


推荐阅读