Что такое Субъект?

Почему RxJava нужен asObservable?

Технически каждый предмет уже является наблюдаемым. В чем преимущество этого, просто набрасывая его, как

Observable obs = subject;

Ответ 1

Если бы вы просто бросили Subject на Observable вы все равно могли бы использовать его как Subject, отбросив его:

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

Observable.asObservable() фактически не передает тип Observable; он фактически обертывает текущий Observable. Это означает, что никто не имеет доступа к Observable вверх.

Тот же код, использующий asObservable() сбой ClassCastException:

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

Это очень похоже на final модификатор. Иногда вы не хотите, чтобы код имел 100% контроль над всем.

Ответ 2

Мне нужно было "запомнить" испущенную стоимость для последующих подписчиков, поэтому я использовал BehaviourSubject. Я решил вернуть Observable, чтобы подписчики не пытались отправить данные на него.