カスタムイベントとイベントリスナーを作成する方法を学ぶためにGoogleで検索しました。それについてのいくつかの記事を読んだ後、私はまだ混乱しています。カスタムイベント(GUIに関連しないイベント)とハンドラーを作成する方法のレビューをお願いしたいと思います。カスタムイベントとリスナーを作成する方法について簡単な説明を提供できる人もいますか?
2 に答える
基本的に、次のようなリスナーとしてインターフェースを作成します
public interface EatListener {
...
}
EatListener クラス内には、メソッドのパラメーターとしてイベントを指定して呼び出すメソッドがあります。そのような
public void onEat(EatEvent);
次に、EatListener を実装またはインスタンス化する Human のようなクラスを作成できます。そのような
public class Human {
private EatListener listener;
public void eatFood(Food food) {
if(listener != null) {
listener.onEat(new EatEvent(food));
}
}
}
次に、実際の EatEvent が必要です。これは、食品のラッパーと同じくらい単純で、追加のデータが含まれている可能性があります。
Java の GUI と同様に、そのインターフェイスから匿名の内部クラスを作成できます。
new EatListener() {
public void onEat(EatEvent event) {
System.out.println("I just ate " + event.getFood().getName());
}
}
私は多くのイベントベースのシステム(非GUI)を作成しましたが、独自のシステムを実装するには多くの落とし穴があります。古典的なもののいくつかは、スレッド化とメモリリークです。
スレッド化/プロセス制御とは、イベントを発生させたときに、リスナーがいつ呼び出されるかを意味します-すぐにまたは後で?すぐに起動すると、リスナーが呼び出された直後に変化するイベントに絶えず反応する、非常にパフォーマンスの低いシステムになってしまう可能性があります。ここに簡単な答えはありません、そしてそれは本当にあなたの必要性に依存します。一般に、イベントの発生を延期できる場合は、システムのパフォーマンスが向上します(同じイベント、または同じイベントにつながるイベントのサイクルに対してリスナーを何度も呼び出すことを回避できるため)
2番目の大きな落とし穴はメモリリークです。Javaに削除がないのは素晴らしいことですが、リスナーはあなたの足に縛られた巨大な銃です。大量のメモリを使用するインスタンスに接続されているリスナーがある場合、別のオブジェクトにそのリスナーへの参照が含まれている限り、そのメモリはぶらぶらします。これには、WeakReferencesなどの解決策がたくさんありますが、一般に、アプリケーションをテストするときは、リスナーの数を慎重に調べて、それらが適切にデタッチ(リッスンしない?:))することを確認する必要があります。
要するに、私があなたなら、次のようなものを使用することを検討します: http: //docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/eventbus/package-summary.html http:// これらの問題の多くを念頭に置いて開発されたcodingjunkie.net/guava-eventbus/ 。