wake-up-neo.net

Observer ist veraltet in Java 9. Was sollen wir stattdessen verwenden?

Java 9 ist herausgekommen 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.

119
curious95

Warum ist das so? Bedeutet das, dass wir kein Beobachtermuster mehr implementieren sollten?

Den letzten Teil zuerst beantworten -

[~ # ~] ja [~ # ~], das heißt, Sie sollten Observer und Obervables mehr.

Warum wurden sie veraltet -

Sie haben kein ausreichend umfangreiches Ereignismodell für Anwendungen bereitgestellt. Zum Beispiel könnten sie nur die Vorstellung unterstützen, dass sich etwas geändert hat, aber keine Informationen darüber übermitteln, was sich geändert hat.

Alex 'Antwort macht deutlich, dass Observer eine Schwäche hat: alle Observables sind gleich. Sie müssen die auf instanceof basierende Logik implementieren und das Objekt in die Observable.update() -Methode in einen konkreten Typ umwandeln.

Hinzu kommt, dass es Fehler wie den folgenden gab: die Klasse Observable konnte nicht serialisiert werden , da die Schnittstelle Serializable nicht implementiert wurde und alle ihre Mitglieder privat waren.

Was ist eine bessere Alternative dazu?

Auf der anderen Seite gibt es in Listeners viele Typen, die über Callback-Methoden verfügen und kein Casting erfordern. Wie @Ravi in ​​seiner Antwort gezeigt hat, können Sie stattdessen PropertyChangeListener verwenden.

Für den Rest wurde der @Deprecation Mit der richtigen Dokumentation versehen, um auch andere Pakete zu untersuchen, die in anderen Antworten verlinkt sind.


Beachten Sie, dass die Ablehnung auch mit einer Analyse markiert wurde, wie in diese Mail - angegeben.

Heutzutage trifft sie wahrscheinlich jeder, der auf diese stößt, versehentlich, während er RxJava oder andere Frameworks für reaktive Streams verwendet. In diesem Fall möchten Benutzer normalerweise stattdessen die APIs von jdk9 Java.util.concurrent.Flow Verwenden, damit alle Frameworks für reaktive Streams mit ihren geplanten zukünftigen jdk9-kompatiblen Versionen kompatibel/interoperabel sind.

Edit: Erwähnenswert ist auch, dass die APIs nicht in erster Linie aus dem oben genannten Grund veraltet sind, sondern auch nicht in der Lage zu sein, den in den Kommentaren einiger der (oben verlinkten) Fehlerberichte erwähnten Legacy-Code beizubehalten, um eine Verbesserung seiner Implementierung auf die eine oder andere Weise zu kennzeichnen.

91
Naman

Ja, es ist veraltet in Java 9. Und wir können kein Beobachtermuster mehr implementieren.


Warum ist das so?

Es gibt weitere Gründe:

Nicht serialisierbar - Seitdem implementiert Observable Serializable nicht. 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 unterschiedlicher Reihenfolge und möglicherweise in unterschiedlicher Reihenfolge erfolgen Threads, was ausreicht, um die "Threadsicherheit" zu stören.

Weniger zu bieten -

Sie bieten kein ausreichend umfangreiches Ereignismodell für Anwendungen. Beispielsweise unterstützen sie nur die Vorstellung, dass sich etwas geändert hat, vermitteln jedoch keine Informationen darüber, was sich geändert hat

Offene Probleme - Wie bereits erwähnt, wurden viele wichtige Probleme aufgeworfen (Thread-Sicherheit, serialisierbar), und die meisten von ihnen hatten Komplexitäten zu beheben und waren "immer noch nicht behoben" "oder Keine aktive Entwicklung , und das ist der Grund, warum es veraltet ist .

Ich würde auch empfehlen, diese Antwort zu lesen Warum sollte das Beobachtermuster veraltet sein? , @Jeff hat andere Gründe für die Veraltetheit erklärt.


Also, was ist die Alternative, die wir haben?

Sie können PropertyChangeEvent und PropertyChangeListener from Java.beans Paket.

33
Ravi

Warum ist Observer in Java 9 veraltet?

Ans: Die Observable -Klasse und die Observer -Schnittstelle wurden in Java = 9, da das von Observer und Observable unterstützte Ereignismodell sehr begrenzt ist, die Reihenfolge der von Observable übermittelten Benachrichtigungen nicht festgelegt ist und Statusänderungen nicht einzeln aufgeführt werden. eine Korrespondenz mit Benachrichtigungen.

Siehe Java doc 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 ist eine in Java 9 eingeführte Klasse mit 4 miteinander verbundenen Schnittstellen: 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 zum Verknüpfen eines Flow.Publisher und Flow.Subscriber.

Siehe Java doc https://docs.Oracle.com/javase/9/docs/api/Java/util/concurrent/Flow.html

10
Mohit Tyagi

In Anbetracht dessen, dass die Observable -Klasse und die Observer -Schnittstelle ab Java= 9 veraltet sind Javas Observer und Observable sind in JDK veraltet 9

Das von Observer und Observable unterstützte Ereignismodell ist sehr begrenzt, die Reihenfolge der von Observable gelieferten Benachrichtigungen ist nicht festgelegt, und Zustandsänderungen stimmen nicht eins zu eins mit Benachrichtigungen überein. Verwenden Sie für ein umfangreicheres Ereignismodell das Paket Java.beans. Verwenden Sie für zuverlässiges und geordnetes Messaging zwischen Threads eine der gleichzeitigen Datenstrukturen im Paket Java.util.concurrent. Informationen zur Programmierung von reaktiven Streams finden Sie in der Flow-API.

7
Aomine