Necesito analizar algunos mensajes. Los primeros 4 bytes de un mensaje identifican el tipo de mensaje, por lo que, al usarlo, puedo instanciar un objeto del tipo adecuado. Para hacer de esto una operación eficiente, pensé que crearía un mapa hash donde la clave son los primeros 4 bytes, y el valor es el constructor del objeto. Puedo buscar el constructor e invocarlo.Tratando un constructor como una función en Scala: ¿cómo poner constructores en un mapa?
Después de todo, los constructores son solo funciones, y no debería haber ningún problema para poner funciones en un mapa. Resulta que estoy teniendo algunas dificultades con esto porque no sé cómo expresar la referencia al constructor correctamente.
Para concretar con un ejemplo simplificado, supongamos que tenemos una clase de base de mensajes, MsgBase
, y un par de subclases, MsgA
y . Si creo un objeto complementario para cada uno de los mensajes y le agrego una función de fábrica, puedo hacer la matriz sin ningún problema al usar esas funciones.
Aquí hay una muestra simplificada que toma el mensaje como una cadena.
class MsgBase(message: String) { }
class MsgA(message: String) extends MsgBase(message) { }
object MsgA { def makeIt(message: String): MsgA = new MsgA(message) }
y donde MsgB
es similar. Entonces puedo hacer el mapa:
val cm = Map[String, (String) => MsgBase]("a" -> MsgA.makeIt, "b" -> MsgB.makeIt)
val myMsg = cm("a")("a.This is the message")
Parece como si tuviera que ser capaz de hacer referencia al constructor mensaje de objeto directamente en la expresión construir el mapa, en lugar de utilizar la función trivial en el objeto acompañante, pero no he No encontré ninguna forma de expresar eso. ¿Hay alguna manera?
'después de todo, los constructores son solo funciones' ¿Lo son? ¿Quién dice eso? Mi impresión es diferente Normalmente, puedo invocar una función varias veces en un objeto y no tengo que llamar 'nuevo', solo para nombrar las dos primeras diferencias, que me vienen a la mente. –
@ user-unknown sí, los constructores en realidad son funciones (estáticas): (i) el uso de 'nuevo' es sintaxis adicional solo para recordarle que este es un tipo particular de función (muchos idiomas omiten la palabra clave, incluido el caso de Scala) constructores de clase). (ii) Es un método estático en esencia; no llama al constructor sobre un objeto existente (no es un método). –