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?
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?
Pourquoi est-ce? Ça veut dire que nous ne devrions pas mettre en œuvre pattern observer plus?
Répondant à la dernière partie de la première
OUI, cela signifie que vous ne devriez pas mettre en oeuvre Observer
et Obervable
s plus.
Pourquoi ont-ils été désapprouvée -
Ils n'offrent pas assez riche modèle d'événement pour les applications. Par exemple, ils ne pourraient soutenir que la notion que quelque chose a changé, mais je n'ai pas transmettre toute information au sujet de ce qui a changé.
Alex de la réponse qu' il met bien l'avance qu' Observer
a une faiblesse: tous Observable
s sont les mêmes. Vous devez implémenter la logique qui est basé sur instanceof
et le cast de l'objet de type de béton en Observable.update()
méthode.
Pour ajouter à cela il y avait des bugs comme on ne pouvait pas sérialiser l' Observable
classe parce que, comme il ne l'a pas mise en œuvre d' Serializable
interface et tous ses membres ont été privés.
Ce qui est une meilleure alternative pour qui?
D'autre part Listeners
ont un grand nombre de types et ils ont des méthodes de rappel et ne nécessitent pas de casting. Comme indiqué par @Ravi de sa réponse , vous pouvez faire usage de PropertyChangeListener
à la place.
Pour le reste de l' @Deprecation
a été marqué avec la documentation appropriée pour explorer d'autres paquets liés à d'autres réponses que de bien.
Notez que la dépréciation a été marquée également par une analyse comme indiqué dans ce courrier -
Ces jours, quelqu'un que la rencontre avec ces est probablement frapper par erreur en utilisant
RxJava
ou d'un autre réactif-flot des cadres de. Dans auquel cas, les utilisateurs souhaitent utiliser à la place la jdk9java.util.concurrent.Flow
Api que tous les réactifs flux cadres doit être compatible/interopérables au sein de leurs projets à venir jdk9 des versions compatibles.
Edit: Il est également intéressant de mentionner que la désapprobation de l'Api n'est pas seulement en raison de la au-dessus de la raison, mais aussi le fait d'être incapable de maintenir cet héritage de code comme mentionné dans les commentaires de quelques-uns des rapports de bug (lien ci-dessus) qui ont été soulevées à l'occasion d'une amélioration de sa mise en œuvre dans l'un ou l'autre manière.
Oui, c'est déconseillé en Java 9. Et, nous ne pouvons pas mettre en œuvre pattern observer plus.
Il y a plus de raisons :
Pas Sérialisable - Depuis, Observable n'est pas implémente Serializable. Donc, vous ne pouvez pas Sérialiser Observable ni ses sous-classe.
Pas de Fil de Sécurité - Les méthodes peuvent être remplacées par des sous-classes, et la notification d'événements peuvent se produire dans des ordres différents et, éventuellement, sur des threads différents, ce qui est suffisant pour perturber le "filet de sécurité".
Ils ne fournissent pas un assez riche modèle d'événement pour les applications. Pour exemple, ils prennent en charge uniquement la notion que quelque chose a changé, mais ils ne transmet aucune information sur ce qui a changé
Les Questions ouvertes - Comme mentionné, il y avait beaucoup de questions majeures soulevées (fil de sécurité, Serializable) et la plupart d'entre eux avaient des complexités de fixer et de 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é autres raisons pour l'autodérision.
Vous pouvez utiliser PropertyChangeEvent
et PropertyChangeListener
de java.beans
package.
Pourquoi Observateur est déconseillée en Java 9?
Réponse: L'
Observable
de la classe et de l'Observer
interface ont été dépréciées en Java 9 parce que le modèle d'événement soutenu parObserver
etObservable
, est très limité, de l'ordre de notifications envoyées parObservable
n'est pas spécifié, et les changements d'état ne sont pas dans "un pour un" la correspondance avec les notifications.Voir la doc Java https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html
Suppléant de modèle Observateur?
Il existe de nombreuses variantes de design pattern Observateur et Réactive les cours d'eau est l'un d'entre eux.
Réactif de Ruisseaux ou de l'API de Flux:
Flow
est une classe introduite dans Java 9 et a 4 interdépendants interfaces :Processor
,Publisher
,Subscriber
etSubscription
.
Flow.Processor
: Un composant qui agit à la fois comme un Abonné et de l'É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'unFlow.Publisher
etFlow.Subscriber
.Voir la doc Java https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html
Considérant que l' Observable
de la classe et de l' Observer
interface ont été dépréciés de Java 9. Comme pour le poste de Java Observateur et Observables Sont Désapprouvées dans le JDK 9
Le modèle d'événements pris en charge par un Observateur et Observable est assez limitée, l'ordre des notifications envoyées par Observable est quelconque, et les changements d'état ne sont pas dans "un pour un" la correspondance avec les notifications. Pour une plus riche modèle d'événement, pensez à utiliser l'
java.beans
package. Pour un service fiable et ordonné de messagerie entre les threads, envisager de à l'aide de l'un de la concurrente des structures de données dans lejava.util.concurrent
package. Pour les flux de réactif style de programmation, consultez le Flux d'API.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.