В netty MessageEvent (оболочка для сообщений) имеет метод Object getMessage() для получения реального передаваемого сообщения из сети. Читая исходный код, я заметил, что они активно используют оператор instanceof для переключения между методами.
Однако, имея большое разнообразие типов сообщений, я хотел бы избежать такого метода:
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
if (e.getMessage() instanceof MessageType1) {
...
} else if (e.getMessage() instanceof MessageType2) {
...
} ... {
...
} else if (e.getMessage() instanceof MessageTypeN) {
...
} else {
ctx.sendUpstream(e);
}
}
Написание различных методов с использованием полиморфизма было бы намного лучше, например:
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
// MessageType implements Message
if (e.getMessage() instanceof Message) {
handleMessage(ctx, (Message) e.getMessage());
} else {
ctx.sendUpstream(e);
}
}
void handleMessage(ChannelHandlerContext ctx, MessageType1 m) {
...
}
...
void handleMessage(ChannelHandlerContext ctx, MessageTypeN m) {
...
}
Но я не могу из-за ограничений понижения. Есть ли чистый способ сделать это или я привязан к каскаду instanceof? Я мог бы вывести логику из обработчика, используя методы .doSomething() внутри подтипов сообщений, но я хотел бы сохранить бизнес-логику внутри конвейера netty.