2016-02-02 19 views
9

Perché RxJava necessita di asObservable?A cosa serve Subject.asObservable?

Tecnicamente ogni soggetto è già un osservabile. Qual è il vantaggio di sopra proprio il cast come

Observable obs = subject; 
+2

Javadoc fornisce una risposta alla tua domanda: 'Questo è utile, ad esempio quando hai un'implementazione di una sottoclasse di Osservabile ma vuoi nascondere le proprietà ei metodi di questa sottoclasse da chiunque tu stia passando a Osservabile a. E 'questo quello che stai cercando? – AndroidEx

+1

Incapsulamento con AsObservable: http://www.introtorx.com/Content/v1.0.10621.0/09_SideEffects.html#AsObservable –

+0

Ho letto la documentazione in precedenza. Ma qual è il vantaggio rispetto alla semplice restituzione della super classe come tipo? –

risposta

16

Se si dovesse lanciare solo il Subject a un Observable allora si potrebbe ancora utilizzarlo come Subject lanciando indietro:

PublishSubject<String> subject = PublishSubject.create(); 
subject.subscribe(System.out::println); 
Observable<String> observable = subject; 
((PublishSubject<String>) observable).onNext("Hello, world!"); 

Observable.asObservable() in realtà non gettato il tipo da Observable; in realtà avvolge l'attuale Observable. Ciò significa che nessuno ha accesso a monte Observable.

Lo stesso codice utilizzando asObservable() si blocca con un ClassCastException:

PublishSubject<String> subject = PublishSubject.create(); 
subject.subscribe(System.out::println); 
Observable<String> observable = subject.asObservable(); 
((PublishSubject<String>) observable).onNext("Hello, world!"); 

E 'un po' come il modificatore final. A volte non vuoi che il codice abbia il controllo del 100% su tutto.

-1

avevo bisogno di "ricordare" il valore emesso per gli abbonati successive da utilizzare, quindi ho usato un BehaviourSubject. Ho scelto di restituire un Observable in modo che gli abbonati non provassero a inviare dati ad esso.

+0

Non voglio discutere perché è meglio passare un'interfaccia su un'implementazione, voglio sapere qual è il vantaggio non solo di lanciarlo in quanto eredita da Observable. –