web-dev-qa-db-ja.com

Javaのリスナーの目的は何ですか?

私はこれをオンラインで探しましたが、それが何をするのかについての適切な説明を見つけることができませんでした。私が見たのはJavaインターフェースであり、それは「リスナー」として別のクラスのパラメーターとして渡されました。人々はさまざまなリスナーをリストに追加し、それらをすべて単一のメソッドで呼び出しました。

なぜ使用するのか分かりません。誰かが説明することを気にすることはできますか?

これは、誰かがリスナーを使用するように言った元のヘルプ投稿です。

リンク

9
Jacob Macallan

KillMonsterEventListenerをリンクしたコード例では

public interface KillMonsterEventListener {
    void onKillMonster ();
}

aPIのユーザーが次のようなことを伝える方法を提供します。

以下にコードを示します。モンスターが殺されたら、呼び戻してください。何をすべきかを決めます。

これは、実行ストリームの特定のポイント(具体的には、モンスターが殺されたポイント)でコードをプラグインする方法です。私はこのようなことをすることができます:

yourClass.addKillMonsterEventListener(
    new KillMonsterEventListener() {
        public onKillMonster() {
            System.out.println("A good monster is a dead monster!");
        }
    }
);

別の場所に別のリスナーを追加できます。

yourClass.addKillMonsterEventListener(
    new KillMonsterEventListener() {
        public onKillMonster() {
            monsterCount--;
        }
    }
);

あなたのコードがモンスターを殺すことでリスナーのリストを通過するとき、すなわち.

for (KillMonsterEventListener listener : listeners) {
    listener.onKillMonster()
}

両方のコードスニペット(つまり、monsterCount--および印刷出力)が実行されます。それについての良いところは、あなたのコードが私のものから完全に切り離されていることです:私が何を印刷しているのか、どの変数を減分しているのかなどはわかりません。

11
dasblinkenlight

これは、 イベント駆動型プログラミング と呼ばれるプログラミングパラダイムの一部です。オブジェクトは、特定の場合、たとえば変更されたときに、他のオブジェクトにメッセージを送信します。これは、GUIプログラミングでよく使用されます。各GUIウィジェットはクラスによって実装されます。あなたが処理したいときユーザーがマウスをクリックすると、リスナー(イベントハンドラーとも呼ばれる)がGUIウィジェットに追加されます。ユーザーがウィジェットをクリックすると、ウィジェットは登録されたリスナーにイベントを送信し、アプリケーションがマウスクリックに応答できるようにします。これにより、フレームワーク(GUIウィジェットクラス)とアプリケーションコードが分離されます。 (Swingなどの一部のGUIフレームワークでは、オブジェクトに任意の数のリスナーを追加できますが、他のリスナーでは1つだけ指定できます。)

また、他の分野では、イベント駆動型プログラミングが役立ちます。オブジェクトを観察したい場合があります( Observer pattern を参照)。たとえば、これをサポートするコレクションは、コンテンツが変更された場合にイベントを送信します。これが発生した場合、何らかの処理を実行する必要がある場合は、このクラスのリスナーとして自分自身を追加できます。別の方法は、コレクションにアイテムを追加するたびに後処理を呼び出すことですが、これはエラーが発生しやすくなります。

6
Hoopje

Listenerは、Javaで observerdesign patter を実装する一般的な形式です。この手法は callback とも呼ばれます。これは手続き型言語の世界から来た用語です。

Observersは、observableで登録し、次にobservers何らかのイベントが発生したとき、または何かについて通知する必要があるとき。

多くのフレームワークライブラリは、オブザーバブルの役割を果たします。例:

  • メッセージングミドルウェアの着信メッセージのリスナーとして、自分自身(つまり、リスナーインターフェイスの実装)を登録します。
  • オペレーティングシステムでユーザーが行ったいくつかの変更のリスナーとして自分を登録します。
  • ボタンがクリックされたなど、GUIイベントのリスナーとして自分自身を登録します。

Javaコードの例:

パート1-観測可能なエンティティ

import Java.util.LinkedList;
import Java.util.List;

public class Observable {
    private List<Observer> observers;

    public Observable() {
        observers = new LinkedList<>();
    }

    public void addObsever(Observer observer) {
        observers.add(observer);
    }

    private  void notifyObservers(String whatHappened) {
        for (Observer observer : observers) {
            observer.onSomethingHappened(whatHappened);
        }
    }

    public void doSomeStuff() {
        // ...
        // Do some business logic here.
        // ...

        // Now we want to notify all the listeners about something.
        notifyObservers("We found it!");

        // ...
        // Do some business logic here
        // ...
    }
}

パート2-オブザーバー/リスナーインターフェイス

public interface Observer {
    void onSomethingHappened(String whatHappened);
}

パート3-オブザーバー/リスナーインターフェイスの基本的な実装

public class MyObserver implements Observer {
    @Override
    public void onSomethingHappened(String whatHappened) {
        System.out.println(whatHappened);
    }
}

パート4-すべてをまとめる

public class Main {
    public static void main(String[] args) {

        // Create the observable.
        Observable myObservable = new Observable();

        // Create the observers (aka listeners).
        Observer myObserverA = new MyObserver();
        Observer myObserverB = new MyObserver();

        // Register the observers (aka listeners).
        myObservable.addObsever(myObserverA);
        myObservable.addObsever(myObserverB);

        myObservable.doSomeStuff();

    }
} 

そして、標準出力の結果は次のようになります:

We found it!
We found it!
6
MartinCz

サーブレットリスナーは、セッションを作成するときやセッションに属性を配置するとき、または別のコンテナーで非アクティブ化してアクティブ化するときなど、Webコンテナーのイベントをリッスンするために使用され、これらのイベントをサブスクライブするためにweb.xmlでリスナーを構成できます、たとえば、HttpSessionListener。

リスナーは、アプリサーバーのイベントにアタッチできる実際の物理リクエストに対してトリガーされます。リスナーを使用すると、アプリケーションレベル、セッションレベル、ライフサイクルの変更、属性の変更などを追跡できます。

ライフサイクルイベントの発生時にメソッドが呼び出されるリスナーオブジェクトを定義することにより、サーブレットのライフサイクル内のイベントを監視し、対応できます。

サーブレットリスナーのブログ投稿はこちら http://array151.blogspot.in/2016/12/servlet-listener.html

1
Sunil Garg

リスナーを使用して、他のコードが「条件」/「イベント」を通知できるようにします。たとえば、マウスを移動/クリック/ドラッグした場合、「マウスリスナー」を呼び出すことができます。リスナーに提供する理由は、アプリケーションによって異なります。

0

リスナーは、イベントが発生するといくつかの作業を行います。それらは「イベントリスナー」と呼ばれます。クリック、ホバーなどのイベント。たとえば、JavaのActionListenerインターフェイスがあります。イベントが発生するとactionPerformed()メソッドを呼び出します。詳細については、 http://Java.about.com/od/a/g/Actionlistener.htm を参照してください。

0
Sachin Tanna

リスナーは、状態の変化について通知するために使用されます。ほとんどの場合、リスナーをオブザーバーと考えることができます。そのため、何か面白いことが起こるたびにリスナーが呼び出されます。

パターンの詳細については、次のWebサイトのJavaを参照してください。

http://www.journaldev.com/1739/observer-design-pattern-in-Java-example-tutorial

http://www.developer.com/Java/implementing-behavioral-patterns-in-Java.html

0
jakubbialkowski