Вот мое решение:
Предполагая, что все "процессоры" выполняют схожие вещи, я предлагаю расширить их все из черты характера вместо использования общих конструкций уровня класса.Давайте предположим следующую структуру:
trait Processor {
def process=println("default process")
}
case class ProcessorOne() extends Processor
case class ProcessorTwo() extends Processor {
override def process=println("process 2")
}
case class ProcessorThree() extends Processor {
override def process=println("process 3")
}
Мы создаем карту и помещаем в нее все process
функции:
val myFuncs =
Map("string1" -> (() => ProcessorOne().process),
"string2" -> (() => ProcessorTwo().process),
"string3" -> (() => ProcessorThree().process))
Обратите внимание, что это Map[String, Unit]
.Поскольку ваша цель - вызывать функции, вам на самом деле не нужно помещать экземпляры на карту.
Теперь вы можете легко вызывать любую или все эти функции:
val userInput =""
if(myFuncs isDefinedAt userInput)
myFuncs(userInput)()
else
myFuncs.values.foreach(v => v())
Вышевыведет:
default process
process 2
process 3
Таким образом, если ключ отсутствует на карте, будут вызваны все функции (в произвольном порядке), но если ключ находится на карте, то только функция, связанная с этимбудет вызван ключ.
Если вам также нужны функции для запуска в определенном порядке, вы можете использовать LinkedHasMap
или ListMap
для создания карты, которая сохраняет порядок вставки.