Javaアプリケーションでは、バックエンドで通信用にGoogle Guava EventBusを使用しています。これらのイベントの一部は、通知を有効にするためにJerseyのserver-sent eventssupportを使用してクライアント側に送信されます。クライアントサイドは特定の種類のイベントにのみ関心があり、それらのイベントはJSON形式でクライアント側に送信されます。if-elseとJavaの代わりにinstanceofを使用する
現在、我々は巨大なメソッドでJSON本体の生成を処理するためにif-else
とinstanceof
を使用しています。 UIEvent
は、フィルタとして使用されるマーカーインターフェイスに過ぎません。
@Subscribe
public void handleEvent(final UIEvent event) {
if (event instanceof A) {
A a = (A) event;
} else if (event instance B) {
B b = (B) event;
} ...
}
このコードは、ますます多くのイベントがシステムに追加されると乱雑になり始めます。いくつかの研究の後、いくつかの選択肢がありますが、十分ではありません。
1)反射。
反射を使用するということは、正確なタイプを知らなくても宣言的な方法でイベントオブジェクトからデータを取得できることを意味します。しかし、反射を使うことは型セーフではなく、ネストされたパスを扱うときには面倒かもしれません。 a.b.c
。
2)多型
多型がinstanceof
に良い代替のように見えますが、実際にこのケースで動作します。多型を使用するとは、toJSON
〜UIEvent
のようなメソッドを追加することです。しかし、これは依存関係の流れを元に戻し、UIの詳細をイベントバスに公開します。
3)ラッパークラス
私はまた、別のクラスでJSONボディビルのロジックをカプセル化するイベントのラッパークラスを使用して考えています。次に、イベントバスのhandleEvent
メソッドで、イベントオブジェクトの型を取得し、命名規則を使用してラッパークラスを見つけ、ラッパークラスインスタンスを構築して、toJson
メソッドを呼び出してJSON本体を取得します。
public class AWrapper {
public AWrapper(A a) {
}
public Object toJson() {
}
}
これは私が考えることができる最も合理的なアプローチです。
提案とアイデアが必要です。
[多型(http://refactoring.com/catalog/replaceConditionalWithPolymorphism.html)ここで標準パターンです。しかし、可能であれば、イベントのフィールドをテストして、それをオンにしてください。 – markspace
多型にも私の投票があります。しかし、インタフェース上で 'toJson'のようなメソッドを使用すると、jsonを使用することができなくなります。別の解決策として、ジェネリックにシリアル化するために使用するデータプロパティ(Mapなど)の一般的なセットを返すメソッドを追加する方法があります。 –
JacksonやGsonのような現代のライブラリはPOJOをJSONに簡単にシリアル化することができるので、特別な方法は必要ありません。内部イベントとクライアントにブロードキャストする必要があるイベントを区別するカスタム注釈を作成してみませんか?次に、 'handleEvent()'でリフレクションを使用して、アノテーションが存在するかどうかを検査します。 –