さんがイベントを処理する場合のシーケンスよりも良い方法はありますか?
-
23-09-2019 - |
質問
私は最近、このパターンを使用して、ハードコーディングされたマッピングにイベントを処理するために実装複数のオブジェクト間で走りました
public void handleEvent(Event event)
{
if(event.getCode() == SOME_STATIC_EVENT)
doSomething(event);
if(event.getCode() == ANOTHER_STATIC_EVENT)
doSomethingElse(event);
}
doSomethingの機能は、同じクラスのメソッドとして実装されている
は緩いカップリングのために努力することを望んでは、どのようにこのパターンを抽象化することをお勧めでしょうか?また、へ0..N機能がイベントを発射したマッピングのための最善のアプローチは何ですか?
解決
はい、基本的に何がやりたいことは、インターフェイスにイベントタイプをマップするデータ構造を作成することです。ここではマップとして実装単純なものだ。
EventHandlerInterface h;
// eventMap contains a mapping of event codes to
// implementations of EventHandlerInterface
h = eventMap.get(event.getCode());
if(h != null)
{
h.handle(event);
}
これはあなたに別のハンドラを効率的に多数のイベントを処理し、動的に追加することができ、削除、および再マップイベントを与えます。
他のヒント
は類似しており、近くに十分だったSOFのポストが最近あったことを私の応答<のhref = "https://stackoverflow.com/questions/2535185/how-to-build-a-function-on-the-fly -in-javaの/ 2535212#2535212" >ここのは非常によくあなたの質問に答えることができます。
というが、実行可能なよりも、あなたがあなた自身のインタフェースになるだろう。
public abstract interface EventHandler
{
public void run(Event event);
}
あなたは、コード少しクリーナーを作ることによって開始することができます。繰り返しevent.getCode()
を取るために、ローカル変数を使用してください。列挙型に切り替え、あなたがswitch
を使用できるようにます。
AWTがないようにあなたは、複数のメソッドのコールバックインターフェースにデコードできる繰り返しパターンがある場合。
私もの登録は、より具体的になっていることを示唆しています。各イベントタイプごとに異なるコールバックを登録します。でも限りのイベントのうち、イベントコードを取って、そしておそらくイベントを削除など。シートの下には、ハンドラへのマッピングのためのイベントコードを保つかもしれないが、これは不透明でなければなりません。 (ロード時間やパーマ世代のフットプリント)このアプローチの欠点は、非常に詳細な匿名内部クラスが現在(JDK6)していることで、クラス処理が非効率的である。