Мне нужно проанализировать некоторые сообщения. Первые 4 байта сообщения идентифицируют тип сообщения, поэтому, используя это, я могу создать экземпляр объекта правильного типа. Чтобы сделать эту операцию эффективной, я подумал, что создам хэш-карту, где ключ - это первые 4 байта, а значение - конструктор объекта. Я могу просто найти конструктор и вызвать его.
В конце концов, конструкторы - это просто функции, и не должно возникнуть проблем с размещением функций на карте. Оказывается, у меня возникают некоторые трудности с этим, потому что я не знаю, как правильно выразить ссылку на конструктор.
Чтобы конкретизировать упрощенный пример, предположим, что у нас есть базовый класс сообщения, MsgBase
и пара подклассов, MsgA
и MsgB
. Если я создаю сопутствующий объект для каждого сообщения и помещаю в него фабричную функцию, я могу без проблем создать массив, используя эти функции.
Вот упрощенный пример, который принимает сообщение в виде строки.
class MsgBase(message: String) { }
class MsgA(message: String) extends MsgBase(message) { }
object MsgA { def makeIt(message: String): MsgA = new MsgA(message) }
и где MsgB
аналогичен. Затем я могу создать карту:
val cm = Map[String, (String) => MsgBase]("a" -> MsgA.makeIt, "b" -> MsgB.makeIt)
val myMsg = cm("a")("a.This is the message")
Похоже, я должен иметь возможность ссылаться на конструктор объекта сообщения непосредственно в выражении, строящем карту, вместо использования тривиальной функции в сопутствующем объекте, но я не понял любым способом выразить это. Есть ли способ?