Вот ситуация, которую я хочу решить - служба потребляет JSON и выполняет некоторую обработку. Основываясь на строковом значении в одном из полей JSON, я хочу создать один из нескольких классов, реализующих интерфейс.
По сути, я пытаюсь дать входу JSON возможность контролировать, какие функции использовать.
Упрощенная версия моего текущего решения выглядит следующим образом
interface A{
val name: String
fun doSomething()
}
class choseImplementation(val jsonChoice: String){
inner class B: A{
override val name = "B"
override fun doSomething(){// Do B things}
}
inner class C: A{
override val name = "C"
override fun doSomething(){// Do C things}
}
init {
// Instantiate B and C
// Compare B.name and C.name with jsonChoice
// Choose the name that matches jsonChoice and expose the instantiated class
// The exposed class will be used in downstream processing
}
}
selectedImplementation задается строка и предоставляет правильную реализацию, которая будет использоваться системой.
Сейчас я вручную создаю экземпляр каждого класса в функции init и затем сравниваю, что означает, что мне нужно изменить код в двух местах, добавить класс D, а затем включить его в функцию init
Я хочу иметь возможность добавить новый внутренний класс (D реализует A) и автоматически добавить его в процесс создания и выбора.
Приветствуются решения вне этого шаблона
Спасибо !