Observer è obsoleto in Java 9. Cosa dovremmo usare al posto di esso?


Risposte:


104

Perché? Significa che non dovremmo più implementare il modello di osservatore?

Rispondere prima a quest'ultima parte -

SI , ciò significa che non è necessario implementareObservereObervables più.

Perché sono stati deprecati -

Non hanno fornito un modello di eventi abbastanza ricco per le applicazioni. Ad esempio, potrebbero supportare solo l'idea che qualcosa è cambiato, ma non hanno fornito alcuna informazione su ciò che è cambiato.

La risposta di Alex lo mette ben in anticipo e Observerha un punto debole: tutti i Observables sono uguali . Devi implementare la logica su cui si basa instanceofe trasmettere l'oggetto al tipo concreto nel Observable.update()metodo.

Per aggiungere ad esso c'erano bug come se non si potesse serializzare laObservable classe perché non implementava l' Serializableinterfaccia e tutti i suoi membri erano privati.

Qual è un'alternativa migliore a quella?

D'altra parte Listenershanno molti tipi e hanno metodi di callback e non richiedono il cast. Come indicato da @Ravi nella sua risposta, è possibile utilizzare PropertyChangeListenerinvece.

Per il resto, @Deprecationè stato contrassegnato con la documentazione adeguata per esplorare altri pacchetti collegati anche in altre risposte.


Si noti che anche l'ammortamento è stato contrassegnato da un'analisi, come indicato in questo messaggio :

In questi giorni, chiunque li incontri probabilmente li sta colpendo per errore durante l'utilizzo RxJavao altri framework di flusso reattivo. In tal caso, gli utenti normalmente vorranno invece utilizzare le java.util.concurrent.FlowAPI jdk9 secondo cui tutti i framework di flussi reattivi dovrebbero essere compatibili / interoperabili nelle versioni pianificate compatibili con jdk9 in arrivo.

Modifica : Vale anche la pena ricordare che la deprecazione delle API non è principalmente dovuta solo al motivo sopra riportato, ma è anche impossibile mantenere tale codice legacy come menzionato nei commenti di alcune delle segnalazioni di bug (linkate sopra) che sono state sollevate per segnare un miglioramento nella sua attuazione in un modo o nell'altro.


3
+1. Buona risposta, anche se sto ancora cercando di capirlo. Observer in Java è deprecato a causa di qualche problema inerente al modello di progettazione stesso (come definito nel libro da GOF) o al problema del supporto per il modello da Java? In altri linguaggi OO, come C #, C ++, Python, anche il modello di progettazione dell'osservatore presenta lo stesso problema di Java?
Tim

25
Il fatto che una particolare implementazione sia deprecata non significa che il modello Observer sia fatalmente imperfetto. Listenerè anche un osservatore.
Chrylis

@chrylis Grazie, non potrei essere più d'accordo, uno dei motivi principali per deprecare l'API è anche la manutenzione ad esso collegata e che cambiare la sua implementazione avrebbe potuto violare altri codici.
Naman,

@ curious95 Non riesco a capire il modo di notificare contemporaneamente lì.
Naman,

4
@ curious95 Sì, la chiamata notifyObservers()è simultanea. Ecco un codelet dello stesso condiviso per spiegare la sua funzionalità nei dettagli.
Naman,

37

Sì, è obsoleto in Java 9 . E non possiamo più implementare il modello di osservatore.


Perché?

Ci sono più ragioni:

Non serializzabile : poiché Observable non implementa Serializable. Pertanto, non è possibile serializzare Observable né la sua sottoclasse.

Nessuna sicurezza del thread - I metodi possono essere ignorati dalle sue sottoclassi e la notifica degli eventi può avvenire in diversi ordini e possibilmente su thread diversi, il che è sufficiente per interrompere qualsiasi "sicurezza del thread".

Meno da offrire -

Non forniscono un modello di eventi abbastanza ricco per le applicazioni. Ad esempio, supportano solo l'idea che qualcosa è cambiato, ma non trasmettono alcuna informazione su ciò che è cambiato

Problemi aperti - Come accennato, sono stati sollevati molti problemi importanti (sicurezza dei thread, serializzabili) e la maggior parte di essi presentava complessità da risolvere e ancora "non risolto" o nessuno sviluppo attivo , e questo è il motivo per cui è stato deprecato .

Vorrei anche raccomandare di leggere questa risposta Perché il modello di osservatore dovrebbe essere deprecato? , @Jeff ha spiegato altri motivi di deprecazione.


Allora, qual è l'alternativa che abbiamo?

Puoi usare PropertyChangeEvente PropertyChangeListenerdal java.beanspacchetto.


PropertyChangeListenersostituisce Observer, ma cosa dovrei estendere / implementare al posto di Observable?
LastStar007,

Aggiornamento: penso che l'approccio sia quello di aggiungere una PropertyChangeSupportvariabile d'istanza, ma apprezzerei una conferma.
LastStar007,

3
@ LastStar007 Penso che tu abbia ragione. Ho trovato un esempio di codice su Baeldung.com che fa proprio questo.
Dragos Stanciu,

13

Perché Observer è obsoleto in Java 9?

Risposta: La Observableclasse e l' Observerinterfaccia sono state deprecate in Java 9 perché il modello di eventi supportato da Observered Observableè piuttosto limitato, l'ordine delle notifiche consegnate Observablenon è specificato e le modifiche di stato non sono in una corrispondenza uno a uno con le notifiche.

Vedi il documento Java https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html

Alternativo del modello Observer?

Esistono molte alternative al modello di progettazione di Observer e Reactive Streams è una di queste.

Stream reattivi o API di flusso :

Flowè una classe introdotta in Java 9 e dispone di 4 interfacce correlate: Processor, Publisher, Subscribere Subscription.

Flow.Processor : Un componente che funge sia da abbonato che da editore.

Flow.Publisher : Un produttore di articoli ricevuti dagli abbonati.

Flow.Subscriber : Un destinatario di messaggi.

Flow.Subscription: Controllo dei messaggi che collega a Flow.Publishere Flow.Subscriber.

Vedi il documento Java https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html


7

Considerando che la Observableclasse e l' Observerinterfaccia sono state deprecate a partire da Java 9. Secondo il post Java Observer e Observable sono deprecati in JDK 9

Il modello di eventi supportato da Observer e Observable è piuttosto limitato, l'ordine delle notifiche fornite da Observable non è specificato e i cambiamenti di stato non sono in una corrispondenza uno a uno con le notifiche. Per un modello di eventi più ricco, prendere in considerazione l'utilizzo del java.beans pacchetto. Per una messaggistica affidabile e ordinata tra i thread, considerare l'utilizzo di una delle strutture di dati simultanee nel java.util.concurrentpacchetto. Per la programmazione dello stile di flussi reattivi, consultare l'API Flow.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.