Was ist der Unterschied zwischen Event Listeners & Handlern in Java?

81

Im Allgemeinen gibt es in Bezug auf Java Listener und Handler für Ereignisse.
Ich meine, ich benutze sie unwissentlich, nur was auch immer in der API verfügbar ist.

Meine Frage ist, in welchem ​​Fall verwenden wir Listener und in welchem ​​Fall verwenden wir Handler für Ereignisse?

Was ist der Unterschied zwischen ihnen? Eigenschaften??

Ich habe nach Gründen gesucht und konnte keine richtige Erklärung für Java finden.

jlc488
quelle
Dieser Blog-Beitrag hat eine schöne Zusammenfassung. lemnik.wordpress.com/2009/03/04/…
kevinarpe

Antworten:

62

Es gibt keinen formal definierten Unterschied zwischen Zuhörern und Handlern. Einige Leute würden wahrscheinlich argumentieren, dass sie austauschbar sind. Für mich haben sie jedoch eine etwas andere Bedeutung.

Ein Listener ist ein Objekt, das Ereignisse aus einer Quelle abonniert. Vgl. das Beobachtermuster . Normalerweise können sich viele Listener für jeden Ereignistyp anmelden, und sie werden über Methoden hinzugefügtaddXyzListener .

Beispiel: Die MouseListenerin der Java API.

Ein Handler ist ein Objekt, das für die Behandlung bestimmter Ereignisse verantwortlich ist. Ein typisches Szenario wäre ein Handler für ein bestimmtes Ereignis zu schaffen / Aufgabe als Argument für einen Konstruktor, oder setzen Sie den Handler durch ein setXyzHandlerVerfahren. Mit anderen Worten, Sie haben normalerweise einen Handler für jeden Ereignistyp.

Beispiel: Die MemoryHandlerin der Java API.

aioobe
quelle
Hallo, danke für deine Antwort. Was meinst du mit "Abonnieren von Veranstaltungen"? Was meinst du mit "Zuhörer"?
BKSpurgeon
@BKSpurgeon, siehe den Wikipedia-Artikel über Observer Pattern, der in der Antwort verlinkt ist.
Aioobe
33

Der grundlegendste Unterschied ist die Assoziation

  • Der Listener ist der Ereignisquelle zugeordnet (Beispiel: Tastatur).
  • Der Handler ist einem Ereignis zugeordnet (Beispiel: Keydown).

Im Allgemeinen gibt es nur einen zentralen Handler-Manager, der alle Ereignisse verwaltet, während im Falle eines Listeners jede Entität, die zuhören möchte, ihre eigene Sammlung von Listenern verwalten muss

Swapnil
quelle
Maus ist die Ereignisquelle, wenn Sie sich die Analogie ansehen, ist MouseListener der Ereignisquelle zugeordnet, die Maus
Swapnil
23

So sehe ich das:

Ein Zuhörer wartet darauf, dass ein Ereignis ausgelöst wird. Beispielsweise KeyListenerwartet a auf KeyEvents, a MessageListenerwartet auf das Eintreffen von Nachrichten in einer Warteschlange und so weiter.

Der Handler ist für die Bearbeitung des Ereignisses verantwortlich. Normalerweise gehen Zuhörer und Handler Hand in Hand. Beispielsweise teilt der KeyListener dem ExitHandler mit, dass "der Buchstabe Q gedrückt wurde", und der Handler führt eine Logik aus, z. B. das Bereinigen von Ressourcen und das ordnungsgemäße Beenden der Anwendung. Ähnlich würde ein ButtonClickListener demselben ExitHandler mitteilen, dass auf die Schaltfläche "Beenden geklickt" wurde. In diesem Fall haben Sie also zwei verschiedene Ereignisse, zwei verschiedene Listener, aber einen einzigen Handler.

Dogbane
quelle
5

Ein Listener ist ein Objekt, das benachrichtigt wird, wenn ein Ereignis auftritt, und es hat zwei Hauptanforderungen: 1. Es muss bei einer oder mehreren Quellen registriert worden sein, um Benachrichtigungen über bestimmte Ereignistypen zu erhalten. 2. Es muss Methoden zum Empfangen und Verarbeiten implementieren diese Benachrichtigungen. Der Handler ist für den Umgang mit Ereignissen verantwortlich.

naren
quelle
4

Ein Listener wartet auf Ereignisse, bei denen es sich um Datenwertobjekte handelt, die ein Ereignis beschreiben. Wann das Ereignis eingetreten ist und die Reihenfolge der Ereignisse ist oft wichtig. Das Drücken der Taste '0' gefolgt von '1' unterscheidet sich von '1' und '0'.

Ein Handler behandelt ein komplexes Objekt, z. B. eine neue Socket-Verbindung. Der Handler kann das Objekt für eine beliebige Zeitdauer verarbeiten. Die Zeit der Objekterstellung und -reihenfolge ist nicht so wichtig. Eine Verbindung von client0 oder client1 kann in beliebiger Reihenfolge erfolgen.

Peter Lawrey
quelle
4

Ich denke, der Unterschied ist subtil, weil ein konkreter Listener auch ein Event-Handler ist oder zumindest eine Methode hat, die als Event-Handler betrachtet werden kann. Das heißt, ein konkreter Listener verarbeitet oder verwaltet die Reaktion auf das Ereignis, nachdem er ein Ereignisobjekt (von der Ereignisquelle) mit allen nützlichen Informationen über das gerade aufgetretene Ereignis (von der Ereignisquelle) erhalten hat. Da dieser Listener eine xxxListener-Schnittstelle implementieren muss, die ihn zwingt, mindestens eine Methode zu implementieren, die wiederum vom Ereignisquellenobjekt ausgeführt wird, wenn das Ereignis auftritt, kann der Listener selbst als Handler und genauer als Methode von betrachtet werden Die vom Listener-Objekt implementierte Listener-Schnittstelle kann als der echte Event-Handler betrachtet werden. Ich betrachte den Event-Handler also nur als den Code, der als Reaktion auf ein Ereignis ausgeführt wird. Dies unterscheidet sich von einem Listener-Objekt, das ein Element eines abstrakteren Konzepts wie eines Observer-Entwurfsmusters ist. Dies ist meine persönliche Sicht auf das Thema.

Samariter
quelle
4

Meiner Meinung nach ist der wichtigste Unterschied die Tatsache, dass wir Listener pro Ereignisquelle verwenden, im Gegensatz zum Handler, der pro Ereignistyp ist.

oskar
quelle
2

Sie sind konzeptionell dasselbe - ein Objekt, das als Reaktion auf ein UI-Ereignis eine Aktion ausführt. Im Allgemeinen werden diese Objekte in Swing als "Handler" auf der Look-and-Feel-Ebene (für die Behandlung von Widget-Ereignissen auf niedriger Ebene) und als "Listener" auf der abstrakteren UI-Ebene (wo Sie Ihre Anwendungslogik implementieren) bezeichnet ).

kprevas
quelle
0

EventHandler wird in JavaFX für alle UI-Steuerelemente eingeführt. Während der Listener für Observables wie Eigenschaften ausgeliehen ist.

Der EventHandler ist eine Möglichkeit, beobachtbare Ereignisse und UI-Ereignisse zu unterscheiden.

Sotondolphin
quelle
0

Ich habe versucht, alle Informationen zu verstehen, und ich bin verloren. Ich habe mir Delphi (Pascal), C, C ++, Java angesehen ... nichts ist klar. Nach einem Monat ist dies das Problem, wie ich es sehe. Ich bin vielleicht völlig aus der Bahn geraten, also sag es mir bitte ... höflich, bitte.

Ein Ereignisabsender, ein Fänger, solange der Absender den Fänger registriert. Ich habe 4 Dialogfelder, die jedes Mal aktualisiert werden müssen, wenn sich eine Datei (deren Bearbeitungscode sich in einem anderen Modul als den 4 Dialogfeldern befindet) ändert. Ich überlegte, ob ich jedes auf die altmodische Weise aktualisieren sollte, aber dann schaute ich mir Delphi-Ereignisse und die Behandlung von Nachrichten an. Wir werden sehen:

Datei F (Der Absender) ist mit dem Lesen fertig und sollte die Dialoge 1..4 darüber informieren, dass jetzt Daten für sie angezeigt werden und der Benutzer damit spielen kann. Was ist das beste?

Versuchen Sie, die Dialoge 1..4 als Listener zu registrieren, und lässt der Absender irgendwie ein OnUpdatedDataEvent auslösen?

Versuchen Sie, eine Nachricht systemübergreifend zu senden, in der Hoffnung, dass die Dialoge 1..4 sie abfangen?

Beachten Sie, dass das Ereignis die Dinge gekoppelt hält, während Nachrichten nicht ... und ein Problem beim Debuggen sind.

Und ich frage mich, wie der Codeblock Datei 4 Listener (die Dialogfelder) registrieren kann?

Was ich sehe, ist die Möglichkeit eines Kaskadenanrufs, was bedeutet, dass der Anrufer einen Hörer anruft, der den nächsten anruft ... bis er das Ende der Kette erreicht. Ich frage mich sogar, ob das überhaupt möglich ist.

Ein Beispiel:

Angenommen, Datei F ist eine Liste von Sprachen. Jetzt macht DialogBox 1 etwas mit der Liste (fügt zum Beispiel eine neue Sprache hinzu); Dieses Kombinationsfeld aktualisiert die F-Datei. Dies löst wiederum ein DataUpdatedEvent aus. Die 4 Dialogfelder enthalten beispielsweise TComboBoxen, die die Sprachliste anzeigen, wenn sie angezeigt werden. Ich möchte, dass die 4 Felder die Änderung bemerken und ihren eigenen Kombinationsfeldinhalt mit der frisch aktualisierten Datei aktualisieren ... ohne sich Gedanken darüber machen zu müssen, wie die Kombinationsfelder wissen, dass sie ihren Inhalt aktualisieren müssen. Wenn es wie vorgesehen funktioniert, wird der Parameter Sender übertragen und das Dialogfeld, das das dataUpdateEvent ausgelöst hat, wird umgangen, da es bereits aktualisiert wird. Immerhin sollte ein if sender = self dann weiter zum nächsten Event-Handler einfach zu implementieren sein.

All das, weil ich mein Gehirn trainieren möchte ... um Alzheimer zu verhindern, nicht sehr erfolgreich, könnte ich hinzufügen.

Christian Martin
quelle
Hallo und willkommen bei StackOverflow! Soll dies eine Antwort auf die ursprüngliche Frage sein ("Was ist der Unterschied zwischen Ereignis-Listenern und -Handlern in Java?"). In diesem Fall kann es hilfreich sein, die Formulierung so zu formulieren, dass sie die Frage direkter beantwortet und die Merkmale von Ereignis-Listenern im Vergleich zu Handlern in Java klar erläutert.
Alex Lew
-1

Es ist Semantik.

  • Listener ist Schnittstelle.
  • Der Adapter ist eine Klasse, die eine bestimmte Schnittstelle implementiert und eine leere Implementierung für ihre Methoden bereitstellt. Dies ist hilfreich, wenn Sie nicht alle Schnittstellenmethoden implementieren müssen.
  • Der Handler implementiert mehrere Schnittstellen oder delegiert Aufrufe an mehrere Schnittstellen.
AlexR
quelle
1
Ich würde nicht sagen, dass ein Hörer notwendigerweise eine Schnittstelle ist. Der BasicButtonListener ist beispielsweise eine konkrete Klasse.
Aioobe