Observer est déprécié en Java 9. Que devrions-nous utiliser à la place?

Java 9 est sorti, et Observer a été déprécié. Pourquoi est-ce? Cela signifie-t-il que nous ne devrions plus mettre en œuvre le modèle de l'observateur?

Il serait bon de savoir ce qu'est une meilleure alternative?

87
demandé sur nullpointer 2017-09-23 16:27:52

4 réponses

pourquoi? Cela signifie-t-il que nous ne devrions plus mettre en œuvre le modèle de l'observateur?

première réponse à la dernière partie -

Oui , cela signifie que vous ne devriez plus mettre en œuvre Observer et Obervable S.

pourquoi ont - ils été dépréciés -

ils n'ont pas fourni un riche assez de modèle d'événement pour les applications. Par exemple, ils ne pouvaient appuyer que la notion que quelque chose avait changé, mais ils ne transmettaient aucune information sur ce qui avait changé.

Alex réponse il met joliment avance que Observer a une faiblesse: tous les Observable s sont les mêmes . Vous devez mettre en œuvre la logique qui est basée sur instanceof et mouler objet à type de béton dans la méthode Observable.update() .

pour ajouter à cela il y avait des bogues comme un ne pouvait pas sérialiser la classe Observable parce que comme il n'a pas mis en œuvre Serializable interface et tous ses membres étaient privés.

Quelle est la meilleure alternative?

d'autre part Listeners ont beaucoup de types et ils ont des méthodes de rappel et ne nécessite pas de casting. Comme l'a souligné @Ravi dans son réponse vous pouvez utiliser PropertyChangeListener à la place.

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


notez que la dépréciation a aussi été marquée avec une analyse comme indiqué dans this mail -

de nos jours, ceux qui les rencontrent les frappent probablement par erreur lors de l'utilisation de RxJava ou d'autres cadres de flux réactifs. Dans dans ce cas, les utilisateurs préféreront normalement utiliser le jdk9 java.util.concurrent.Flow Api que tous les réactifs flux cadres devraient être compatibles/interopérables dans le cadre de leur planification à venir jdk9-versions compatibles.

Edit : il convient également de mentionner que la la dévalorisation de L'API n'est pas seulement due à la raison mentionnée ci-dessus, mais aussi à l'impossibilité de maintenir un tel code tel que mentionné dans les commentaires de quelques rapports de bogue(liés ci-dessus) qui ont été soulevés pour marquer une amélioration dans sa mise en œuvre de l'une ou l'autre manière.

65
répondu nullpointer 2017-09-24 01:53:44

Oui, il est déconseillé dans Java 9 . Et, nous ne pouvons plus mettre en œuvre le modèle de l'observateur.


pourquoi?

il y a d'autres raisons:

Non sérialisable - puisque, Observable ne met pas en œuvre sérialisable. Donc, vous ne pouvez pas sérialiser Observable ni sa sous-classe.

pas de sécurité de fil - les méthodes peuvent être supplantées par ses sous-classes, et la notification d'événement peut se produire dans différents ordres et éventuellement sur différents fils, ce qui est suffisant pour perturber toute "sécurité de fil".

moins offrir -

ils ne fournissent pas un modèle d'événement assez riche pour les applications. Pour exemple, ils soutenir seulement la notion que quelque chose a changé, mais ils ne transmettent aucune information sur ce qui a changé

Open Issues - comme mentionné, il y avait beaucoup de problèmes majeurs soulevés (la sécurité des fils, sérialisable) et la plupart d'entre eux avaient des complexités à corriger et toujours "pas fixe" ou pas de développement actif , et c'est la raison pour laquelle il a été déprécié .

Je vous recommande aussi de lire cette réponse Pourquoi le modèle observateur être obsolète? , @Jeff a expliqué d'autres raisons pour la dépréciation.


alors, quelle est l'alternative que nous avons ?

vous pouvez utiliser PropertyChangeEvent et PropertyChangeListener à partir de java.beans Paquet .

22
répondu Ravi 2017-09-24 07:27:35

pourquoi L'observateur est déprécié dans Java 9?

Ans: la classe Observable et l'interface Observer ont été dépréciées en Java 9 parce que le modèle d'événement supporté par Observer et Observable est assez limité, l'ordre des notifications livré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 Doc Java https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html

alternance de pattern D'Observateur?

il existe de nombreuses solutions de rechange au modèle de conception de L'observateur et les cours D'eau réactifs en font partie.

flux réactifs ou API de flux :

Flow est une classe introduite dans Java 9 et a 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 récepteur de messages.

Flow.Subscription : Message de contrôle de la liaison d'un Flow.Publisher et Flow.Subscriber .

voir Java doc https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html

8
répondu Mohit Tyagi 2017-10-04 10:56:06

considérant que la classe Observable et l'interface Observer ont été dépréciées à partir de Java 9. Selon le post L'observateur de Java et Observable sont dépréciés dans JDK 9

le modèle d'événement soutenu par L'observateur et Observable est assez limité, L'ordre des notifications fournies par Observable n'est pas précisé, et les changements d'état ne sont pas en correspondance un pour un avec notification. Pour une plus riche modèle d'événement, envisager d'utiliser le java.beans paquet. Pour des messages fiables et ordonnés parmi les threads, considérer utilisation de l'une des structures de données simultanées java.util.concurrent paquet. Pour la programmation de style de streams réactifs, consultez L'API de flux.

6
répondu Aomine 2017-09-23 14:13:28