Как создать карту [String, Class] и динамически создать ее объект в Scala - PullRequest
0 голосов
/ 24 октября 2018

Сценарий: У меня есть senario, где мне нужно вызывать класс Processor один за другим, которые требуются поставщиком ввода пользователем, если не предоставлено, он должен вызывать все методы класса Processor и process ()внутри него.

Код:

class OneProcessor{}
class TwoProcessor{}

Для этого я думаю о создании карты [String, instanceOfClass], т. е.

val instanceMap:Map[String,Class] =Map(
    "string1" -> new OneProcessor(),
    "string2" -> new TwoProcessor(),
)

Вопрос: если задан string1 пользователем, мне нужно создать экземпляр OneProcessor () и выполнить его методом processor ().

Если пользователю не предоставлен какой-либо ввод, мне нужно вызвать все ключиMap, и создавать экземпляры всех классов и вызывать процессор () всех ...

Как это сделать в scala?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вот мое решение:

Предполагая, что все "процессоры" выполняют схожие вещи, я предлагаю расширить их все из черты характера вместо использования общих конструкций уровня класса.Давайте предположим следующую структуру:

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 для создания карты, которая сохраняет порядок вставки.

0 голосов
/ 24 октября 2018

Вы можете вызвать newInstance метод для создания экземпляров вне класса.

classOf[OneProcessor].newInstance
...