Котлин.Могу ли я получить все объекты, которые реализуют определенный интерфейс - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть что-то вроде:

interface Options {
    fun load(conf: JsonObject)
}

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

, тогда я хотел бы получить все Objects, которые реализуют параметры interface и вызвать load forEach.

fun main(args: Array) {
    configFuture.whenComplete { config ->
            options.forEach { it.load(config) }
    }
}

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Вы всегда можете использовать шаблон Factory для создания новых экземпляров Options, таким образом вы можете иметь свой собственный OptionsFactory и собственный механизм кэширования.

Это OptionsFactory после создания экземпляраобъект хранит его в кеше (это может быть кэш в памяти или DB..etc), тогда в любое время вы можете запросить у фабрики его кэшированные экземпляры, когда это необходимо.

Это гораздо лучше, если ваши Options объектысоздается во время выполнения / по запросу.

0 голосов
/ 30 сентября 2018

Это не поддерживается языком, поэтому существуют решения для внедрения зависимостей, реестра или поиска служб.

  • Если все объекты зарегистрированы в инфраструктуре внедрения зависимостей, вы можетевыполнить итерацию всех объектов, зарегистрированных в платформе, и найти экземпляры вашего интерфейса.
    • Это, вероятно, будет довольно неэффективно - поэтому кэшируйте результаты, чтобы избежать лишних затрат.
  • Другой подход заключается в использовании пользовательского загрузчика классов и добавлении этогоПользовательский функционал.Простейшим способом, вероятно, является использование библиотеки Reflections для сканирования и загрузки этих классов.Например:

    val reflections = Reflections("my.project.prefix")
    val allClasses = reflections.getSubTypesOf(Options::class.java)
    
  • Самое простое и наиболее часто используемое решение - это просто поддерживать свой собственный «реестр», например, статический объект, содержащий список всех экземпляров.Для этого потребуется вручную добавить любой новый класс, реализующий интерфейс, но это будет простое, производительное и надежное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...