171 votes

Observer est obsolète en 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?

134voto

nullpointer Points 1135

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 Obervables 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 Observables 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 jdk9 java.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.

48voto

jWeaver Points 4191

Oui, c'est déconseillé en Java 9. Et, nous ne pouvons pas mettre en œuvre pattern observer plus.


Pourquoi est-ce?

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é".

Moins à offrir -

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.


Alors, quelle est l'alternative que nous avons ?

Vous pouvez utiliser PropertyChangeEvent et PropertyChangeListener de java.beans package.

23voto

Mohit Tyagi Points 1684

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 par Observer et Observable , est très limité, de l'ordre de notifications envoyées par Observable 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 et Subscription.

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'un Flow.Publisher et Flow.Subscriber.

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

11voto

Aomine Points 42709

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 le java.util.concurrent package. Pour les flux de réactif style de programmation, consultez le Flux d'API.

Prograide.com

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.

Powered by:

X