Java 9 wurde veröffentlicht und Observer
ist veraltet. Warum ist das so? Bedeutet das, dass wir kein Beobachtermuster mehr implementieren sollten?
Es wäre gut zu wissen, was eine bessere Alternative ist.
Java 9 wurde veröffentlicht und Observer
ist veraltet. Warum ist das so? Bedeutet das, dass wir kein Beobachtermuster mehr implementieren sollten?
Es wäre gut zu wissen, was eine bessere Alternative ist.
Antworten:
Warum ist das so? Bedeutet das, dass wir kein Beobachtermuster mehr implementieren sollten?
Den letzten Teil zuerst beantworten -
JA , es bedeutet, dass Sie nicht mehr implementieren solltenObserver
undObervable
s.
Sie lieferten kein ausreichend umfangreiches Ereignismodell für Anwendungen. Zum Beispiel könnten sie nur die Vorstellung unterstützen, dass sich etwas geändert hat, aber keine Informationen darüber vermitteln, was sich geändert hat.
Alex 'Antwort bringt es auf den Punkt, dass Observer
es eine Schwäche hat: Alle Observable
sind gleich . Sie müssen die Logik, die auf instanceof
einem konkreten Typ basiert, implementieren und in eine Observable.update()
Methode umwandeln.
Hinzu kam, dass es Fehler gab, als könnte man dieObservable
Klasse nicht serialisieren , da sie keine Serializable
Schnittstelle implementierte und alle Mitglieder privat waren.
Was ist eine bessere Alternative dazu?
Auf der anderen Seite Listeners
gibt es viele Typen und sie haben Rückrufmethoden und erfordern kein Casting. Wie @Ravi in seiner Antwort angedeutet hat, können Sie davon Gebrauch machen PropertyChangeListener
stattdessen davon .
Für den Rest @Deprecation
wurde das mit der richtigen Dokumentation markiert, um andere Pakete zu untersuchen, die auch in anderen Antworten verlinkt sind.
Beachten Sie, dass die Abschreibung auch mit einer Analyse markiert wurde, wie in dieser Mail angegeben -
Heutzutage trifft jeder, der auf diese stößt, sie wahrscheinlich versehentlich, während er
RxJava
andere Reactive-Stream-Frameworks verwendet. In diesem Fall möchten Benutzer normalerweise stattdessen die jdk9-java.util.concurrent.Flow
APIs verwenden, damit alle Reactive -Streams-Frameworks innerhalb ihrer geplanten kommenden jdk9-kompatiblen Versionen kompatibel / interoperabel sind.
Bearbeiten : Es ist auch erwähnenswert, dass die Ablehnung der APIs nicht in erster Linie auf den oben genannten Grund zurückzuführen ist, sondern auch darauf, dass der in den Kommentaren einiger der oben verlinkten Fehlerberichte erwähnte Fehlercode nicht beibehalten werden kann Markieren Sie eine Verbesserung der Implementierung auf die eine oder andere Weise.
Listener
ist auch ein Beobachter.
Ja, es ist in Java 9 veraltet . Und wir können kein Beobachtermuster mehr implementieren.
Es gibt weitere Gründe:
Nicht serialisierbar - Da Observable Serializable nicht implementiert. Sie können also weder Observable noch seine Unterklasse serialisieren.
Keine Thread-Sicherheit - Die Methoden können von ihren Unterklassen überschrieben werden, und Ereignisbenachrichtigungen können in unterschiedlichen Reihenfolgen und möglicherweise in unterschiedlichen Threads auftreten, was ausreicht, um die "Thread-Sicherheit" zu stören.
Sie bieten kein ausreichend umfangreiches Ereignismodell für Anwendungen. Zum Beispiel unterstützen sie nur die Vorstellung, dass sich etwas geändert hat, aber sie vermitteln keine Informationen darüber, was sich geändert hat
Offene Probleme - Wie bereits erwähnt, wurden viele wichtige Probleme angesprochen (Thread-Sicherheit, serialisierbar), und die meisten von ihnen mussten komplex behoben werden und waren immer noch "nicht behoben" oder keine aktive Entwicklung . Dies ist der Grund, warum sie veraltet sind .
Ich würde auch empfehlen, diese Antwort zu lesen. Warum sollte das Beobachtermuster veraltet sein? , @Jeff hat andere Gründe für die Ablehnung erklärt.
Sie können PropertyChangeEvent
und PropertyChangeListener
aus java.beans
Paket verwenden.
PropertyChangeListener
ersetzt Observer
, aber was soll ich anstelle von erweitern / implementieren Observable
?
PropertyChangeSupport
als Instanzvariable hinzuzufügen , aber ich würde mich über eine Bestätigung freuen.
Warum ist Observer in Java 9 veraltet?
Antwort: Die Observable
Klasse und die Observer
Schnittstelle sind in Java 9 veraltet, da das von Observer
und unterstützte Ereignismodell Observable
sehr begrenzt ist, die Reihenfolge der von gelieferten Benachrichtigungen Observable
nicht angegeben ist und Statusänderungen nicht eins zu eins mit Benachrichtigungen übereinstimmen.
Siehe Java-Dokument https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html
Alternative des Beobachtermusters?
Es gibt viele Alternativen zum Observer-Entwurfsmuster, und Reactive Streams ist eine davon.
Reaktive Streams oder Flow-API :
Flow
eine Klasse in Java 9 und verfügt über 4 miteinander verbundenen Schnittstellen eingeführt: Processor
, Publisher
, Subscriber
und Subscription
.
Flow.Processor
: Eine Komponente, die sowohl als Abonnent als auch als Herausgeber fungiert.
Flow.Publisher
: Ein Hersteller von Artikeln, die Abonnenten erhalten haben.
Flow.Subscriber
: Ein Empfänger von Nachrichten.
Flow.Subscription
: Nachrichtensteuerung, die ein Flow.Publisher
und verbindet Flow.Subscriber
.
Siehe Java-Dokument https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html
In Anbetracht dessen, dass die Observable
Klasse und die Observer
Schnittstelle ab Java 9 veraltet sind. Gemäß dem Beitrag sind Javas Observer und Observable in JDK 9 veraltet
Das von Observer und Observable unterstützte Ereignismodell ist recht begrenzt, die Reihenfolge der von Observable gelieferten Benachrichtigungen ist nicht angegeben, und Statusänderungen stehen nicht im Einklang mit Benachrichtigungen. Verwenden Sie für ein umfassenderes Ereignismodell das
java.beans
Paket. Verwenden Sie für zuverlässiges und geordnetes Messaging zwischen Threads eine der gleichzeitigen Datenstrukturen imjava.util.concurrent
Paket. Informationen zur Programmierung im Stil reaktiver Streams finden Sie in der Flow-API.