web-dev-qa-db-fra.com

Observer est obsolète dans Java 9. Que devrions-nous utiliser à la place?

Java 9 est sorti et Observer est obsolète. Pourquoi donc? Cela signifie-t-il que nous ne devrions plus implémenter de modèle d'observateur?

Il serait bon de savoir quelle est la meilleure alternative?

119
curious95

Pourquoi est-ce? Cela signifie-t-il que nous ne devrions plus implémenter de modèle d'observateur?

Répondre à la dernière partie en premier -

YES, cela signifie que vous ne devriez plus implémenter Observer et Obervables.

Pourquoi ont-ils été déconseillés -

Ils ne fournissaient pas un modèle d'événement assez riche pour les applications. Par exemple, ils pourraient ne soutenir que l’idée que quelque chose a changé, mais ne pas donner d’information sur ce qui a changé.

La réponse d'Alex dit clairement que Observer a un point faible: tous les Observables sont identiques . Vous devez implémenter la logique basée sur instanceof et convertir un objet en type concret dans la méthode Observable.update().

Pour l'ajouter, il y avait des bogues du type impossible de sérialiser la classe Observable car elle n'implémentait pas l'interface Serializable et que tous ses membres étaient privés.

Quelle est la meilleure alternative à cela?

D'autre part, Listeners a beaucoup de types et ils ont des méthodes de rappel et ne nécessitent pas de transtypage. Comme l'a souligné @Ravi dans son réponse , vous pouvez utiliser PropertyChangeListener .

Pour le reste, le @Deprecation a été marqué avec la documentation appropriée pour explorer d'autres paquets comme étant liés dans d'autres réponses.


Notez que la dépréciation a également été marquée par une analyse comme indiqué dans ce mail -

De nos jours, quiconque les rencontre les frappe probablement par erreur en utilisant RxJava ou d'autres frameworks à flux réactif. Dans ce cas, les utilisateurs voudront normalement utiliser les API jdk9 Java.util.concurrent.Flow pour que tous les frameworks de flux réactifs soient compatibles/interopérables dans les versions prévues compatibles avec jdk9.

Edit : Il convient également de mentionner que la dépréciation des API n'est pas principalement due à ce qui précède raison, mais aussi de ne pas pouvoir conserver le code hérité mentionné dans les commentaires de quelques-uns des rapports de bogues (lien ci-dessus) qui ont été soulevés pour marquer une amélioration de son implémentation d’une manière ou d’une autre.

91
Naman

Oui, il est obsolète dans Java 9. Et, nous ne pouvons plus implémenter de modèle d'observateur.


Pourquoi donc?

Il y a plus de raisons:

Non sérialisable - Depuis, Observable n'implémente pas Serializable. Vous ne pouvez donc pas sérialiser Observable ni sa sous-classe.

No Thread Safety - Les méthodes peuvent être remplacées par ses sous-classes, et la notification d'événement peut se produire dans différents ordres et éventuellement sur différentes threads, ce qui suffit à perturber toute "sécurité des threads".

Moins d'offrir -

Ils ne fournissent pas un modèle d'événement assez riche pour les applications. Par exemple, ils ne soutiennent que l’idée que quelque chose a changé, mais ils ne communiquent aucune information sur ce qui a changé.

Problèmes non résolus - Comme indiqué précédemment, de nombreux problèmes importants ont été soulevés (sécurité des threads, Serializable) et la plupart d'entre eux présentaient des complexités à résoudre et n'étaient toujours pas résolus. "ou Pas de développement actif , et c’est la raison pour laquelle il a été obsolète .

Je recommanderais également de lire cette réponse Pourquoi le modèle d'observateur devrait-il être obsolète? , @Jeff a expliqué d'autres raisons de l'obsolescence.


Alors, quelle est l'alternative que nous avons?

Vous pouvez utiliser PropertyChangeEvent et PropertyChangeListener à partir de Java.beans package.

33
Ravi

Pourquoi Observer est obsolète dans Java 9?

Ans: La classe Observable et l'interface Observer ont été déconseillées dans Java 9 car l'événement a Le modèle pris en charge par Observer et Observable est assez limité, l'ordre des notifications envoyées par Observable n'est pas spécifié et les changements d'état ne sont pas en correspondance un pour un avec les notifications.

Voir Java doc https://docs.Oracle.com/javase/9/docs/api/Java/util/Observable.html

Alternate of Observer pattern?

Il existe de nombreuses alternatives de modèle de conception Observer et les flux réactifs en font partie.

Flux réactifs ou API de flux :

Flow est une classe introduite dans Java 9 et comporte 4 interfaces interdépendantes: Processor, Publisher, Subscriber et Subscription.

Flow.Processor: un composant qui agit à la fois comme abonné et éditeur.

Flow.Publisher: Un producteur d'articles reçus par les abonnés.

Flow.Subscriber: Un destinataire de messages.

Flow.Subscription: Commande de message liant un Flow.Publisher à Flow.Subscriber.

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

10
Mohit Tyagi

Considérant que la classe Observable et l'interface Observer sont obsolètes à compter du Java 9. Conformément à l'article , l'observateur et l'observable de Java sont obsolètes en JDK. 9

Le modèle d'événement pris en charge par Observer et Observable est assez limité, l'ordre des notifications envoyées par Observable n'est pas spécifié et les changements d'état ne correspondent pas à une correspondance un pour un avec les notifications. Pour un modèle d'événement plus riche, envisagez d'utiliser le package Java.beans. Pour une messagerie fiable et ordonnée entre les threads, envisagez l’utilisation d’une des structures de données simultanées dans Java.util.concurrent paquet. Pour une programmation de style flux réactifs, voir l’API Flow.

7
Aomine