Tengo la siguiente situación en la que una clase de cliente ejecuta un comportamiento diferente según el tipo de mensaje que recibe. Me pregunto si existe una forma mejor de hacerlo ya que no me gustan las sentencias instanceof y if.Evitar instanciaof al verificar un tipo de mensaje
Una cosa que pensé hacer fue sacar los métodos de la clase del cliente y ponerlos en los mensajes. Pondría un método como process() en la interfaz de IMessage y luego pondría el comportamiento específico del mensaje en cada uno de los tipos de mensajes concretos. Esto simplificaría al cliente porque simplemente llamaría a message.process() en lugar de verificar tipos. Sin embargo, el único problema con esto es que el comportamiento contenido en los condicionales tiene que ver con operaciones en datos contenidos dentro de la clase Cliente. Por lo tanto, si implementé un método de proceso en las clases concretas de mensajes, tendría que pasarlo al cliente y no sé si esto realmente tiene sentido.
public class Client {
messageReceived(IMessage message) {
if(message instanceof concreteMessageA) {
concreteMessageA msg = (concreteMessageA)message;
//do concreteMessageA operations
}
}
if (message instanceof concreteMessageB) {
concreteMessageb msg = (concreteMessageB)message;
//do concreteMessageB operations
}
}
Basado en el hecho de que está utilizando JMS, ¿qué es IMessage? JMS tiene tipos de mensajes predefinidos, por lo que no puede definir el suyo, a menos que tenga un intermediario que los convierta, lo cual es más que un dolor de cabeza a menos que intente abstraer el JMS. – Robin