2012-10-15 8 views
5

カスタムイベントとイベントリスナーを作成する方法をGoogleで検索しました。それについてのいくつかの記事を読んだ後、私はまだ混乱しています。 のカスタムイベント(非GUI関連のイベント)とハンドラの作成方法についてのレビューを依頼したいと思います。カスタムイベントとリスナーを作成する方法の簡単な説明がありますか?あなたは基本的に、このようなEatListenerクラスの内部Javaイベントとイベントリスナー

public interface EatListener { 

    ... 

} 

としてリスナーとしてインターフェイスを作成

答えて

6

、あなたは、メソッドのパラメータとしてイベントを呼び出す方法があります。

public void onEat(EatEvent); 

など、EatListenerを実装またはインスタンス化するクラスを持つことができます。

public class Human { 

    private EatListener listener; 

    public void eatFood(Food food) { 
     if(listener != null) { 
      listener.onEat(new EatEvent(food)); 
     } 
    } 

} 

実際のEatEventが必要です。おそらくいくつかの余分なデータを持つ食料用のラッパーと同じくらい単純なものにすることができます。

あなたはそのインターフェイスから匿名内部クラスを作成することができますJavaの上の任意のGUIと同じように

:私は、イベントベースのシステム(非GUI)をたくさん書いた

new EatListener() { 
    public void onEat(EatEvent event) { 
     System.out.println("I just ate " + event.getFood().getName()); 
    } 
} 
1

と、独自の実装には多くの落とし穴があります。古典的なもののいくつかはスレッディングとメモリリークです。

スレッディング/プロセスコントロールとは、イベントを発生させたとき、リスナーがいつ呼び出されるのかということです。すぐに発砲した場合、リスナーが呼び出された直後に変化するイベントに常に反応している、実際にはパフォーマンスの低いシステムで終わる可能性があります。簡単な答えはここにありません。本当にあなたの必要性にかかっています。一般的に、イベントの発生を延期することができれば、より良いパフォーマンスのシステムを実現できます(同じイベントで何度もリスナーを呼び出したり、同じイベントにつながるイベントのサイクルを繰り返さないようにするため)

2番目の大きな問題はメモリリークです。 Javaでの削除の欠如は素敵なことですが、リスナーはあなたの足に縛られている巨大な銃です。メモリの負荷を使用するインスタンスにアタッチされているリスナーがある場合、別のオブジェクトがそのリスナーへの参照を含む限り、そのメモリはハングします。これにはWeakReferencesのような解決策がたくさんありますが、一般的に、アプリケーションをテストするときにはかなり注意深く、リスナーの数を調べ、正常に切り離されていることを確認する必要があります。要するに

、私があなただったら、私は次のようなものを使用することを検討します:心の中でこれらの問題の多くで開発されてきたhttp://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/eventbus/package-summary.html http://codingjunkie.net/guava-eventbus/

関連する問題