Class EventDispatcher<E,L extends Listener<E>>

java.lang.Object
schule.ngb.zm.util.events.EventDispatcher<E,L>
Type Parameters:
E - Typ der Event-Objekte.
L - Typ der verwendeten Listener-Schnittstelle.

public class EventDispatcher<E,L extends Listener<E>> extends Object
Implementierung einer EventListener-API basierend auf dem Artikel Skilled Listening in Java von Dr. Warren D. MacEvoy.

Der EventDispatcher verwaltet eine Liste von angemeldeten Listenern in einem CopyOnWriteArraySet, dass besonders für Situationen geeignet ist, in denen in der Regel wenige Objekte verwaltet werden müssen, auf die schnell zugegriffen werden soll und die sich selten ändern. Das trifft in den meisten Fällen auf die Listener eines Objekts zu.

Um einen EventDispatcher zu nutzen, muss eine Schnittstelle als Unterinterface von Listener erstellt werden, die Methoden für die einzelnen Events definiert. In der Regel wird eine Methode pro Event angelegt, aber dies ist nicht unbedingt notwendig.

Ein Objekt, dass Events für diese Art von Listener erzeugt, erstellt einen EventDispatcher und registriert die notwendigen Events.


 EventDispatcher<MyEvent, MyEventListener> dispatcher = new EventDispatcher<>();
 dispatcher.registerEventType("start", (evt, listener) -> listener.started(evt));
 dispatcher.registerEventType("stop", (evt, listener) -> listener.stopped(evt));
 

Hier werden zwei Events registriert "start" und "stop". Die Bezeichnung der Events wird nut intern verwendet. Jedes Event registriert eine Funktion, die den Aufruf der Listener-Schnittstelle umsetzt. In der Regel ist dies ein Lambda-Ausdruck von zwei Parametern: dem Event-Objekt vom Typ E und der Listener, der aufgerufen werden soll, vom Typ L.

Nun können MyEventListener angemeldet und Events ausgelöst werden.


 public void addEventListener( MyEventListener listener ) {
     dispatcher.addListener(listener);
 }

 public void removeEventListener( MyEventListener listener ) {
     dispatcher.removeListener(listener);
 }

 public void methodThatCreatesEvents() {
     dispatcher.dispatchEvent("start", new MyEvent());
     // Do something
     dispatcher.dispatchEvent("stop", new MyEvent());
 }
 

Siehe AudioListener und Music für ein Beispiel der Verwendung.

  • Constructor Details

    • EventDispatcher

      public EventDispatcher()
  • Method Details

    • registerEventType

      public void registerEventType(String eventKey, BiConsumer<E,L> dispatcher)
    • addListener

      public void addListener(L listener)
    • removeListener

      public void removeListener(L listener)
    • hasListeners

      public boolean hasListeners()
    • eventRegistered

      public boolean eventRegistered(String eventKey)
    • dispatchEvent

      public void dispatchEvent(String eventKey, E event)