Risposte:
Perché? Significa che non dovremmo più implementare il modello di osservatore?
Rispondere prima a quest'ultima parte -
SI , ciò significa che non è necessario implementareObserver
eObervable
s più.
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 Observer
ha un punto debole: tutti i Observable
s sono uguali . Devi implementare la logica su cui si basa instanceof
e 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' Serializable
interfaccia e tutti i suoi membri erano privati.
Qual è un'alternativa migliore a quella?
D'altra parte Listeners
hanno molti tipi e hanno metodi di callback e non richiedono il cast. Come indicato da @Ravi nella sua risposta, è possibile utilizzare PropertyChangeListener
invece.
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
RxJava
o altri framework di flusso reattivo. In tal caso, gli utenti normalmente vorranno invece utilizzare lejava.util.concurrent.Flow
API 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.
Listener
è anche un osservatore.
Sì, è obsoleto in Java 9 . E non possiamo più implementare il modello di osservatore.
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".
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.
Puoi usare PropertyChangeEvent
e PropertyChangeListener
dal java.beans
pacchetto.
PropertyChangeListener
sostituisce Observer
, ma cosa dovrei estendere / implementare al posto di Observable
?
PropertyChangeSupport
variabile d'istanza, ma apprezzerei una conferma.
Perché Observer è obsoleto in Java 9?
Risposta: La Observable
classe e l' Observer
interfaccia sono state deprecate in Java 9 perché il modello di eventi supportato da Observer
ed Observable
è piuttosto limitato, l'ordine delle notifiche consegnate Observable
non è 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
, Subscriber
e 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.Publisher
e Flow.Subscriber
.
Vedi il documento Java https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html
Considerando che la Observable
classe e l' Observer
interfaccia 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 neljava.util.concurrent
pacchetto. Per la programmazione dello stile di flussi reattivi, consultare l'API Flow.