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.
quelle
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.
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.notifyObservers()
wird gleichzeitig angerufen . Hier ist ein Codelet aus demselben, um seine Funktionalität im Detail zu erklären.Ja, es ist in Java 9 veraltet . Und wir können kein Beobachtermuster mehr implementieren.
Warum ist das so?
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.
Weniger zu bieten -
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.
Also, was ist die Alternative, die wir haben?
Sie können
PropertyChangeEvent
undPropertyChangeListener
ausjava.beans
Paket verwenden.quelle
PropertyChangeListener
ersetztObserver
, aber was soll ich anstelle von erweitern / implementierenObservable
?PropertyChangeSupport
als Instanzvariable hinzuzufügen , aber ich würde mich über eine Bestätigung freuen.Antwort: Die
Observable
Klasse und dieObserver
Schnittstelle sind in Java 9 veraltet, da das vonObserver
und unterstützte EreignismodellObservable
sehr begrenzt ist, die Reihenfolge der von gelieferten BenachrichtigungenObservable
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
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
undSubscription
.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 einFlow.Publisher
und verbindetFlow.Subscriber
.Siehe Java-Dokument https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html
quelle
In Anbetracht dessen, dass die
Observable
Klasse und dieObserver
Schnittstelle ab Java 9 veraltet sind. Gemäß dem Beitrag sind Javas Observer und Observable in JDK 9 veraltetquelle