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) {
...
}
しかし、ダウンキャストの制限によりできません。これを行うためのきれいな方法はありますか、それともインスタンスのカスケードに縛られていますか? Message サブタイプ内で .doSomething() メソッドを使用してロジックを Handler から取り出すことはできますが、ビジネス ロジックは netty パイプライン内に保持したいと考えています。