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?
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 jdk9java.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.
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".
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 .
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
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éesjava.util.concurrent
paquet. Pour la programmation de style de streams réactifs, consultez L'API de flux.