Как получить шаблон NullObject с помощью RxJava
Да, это может звучать немного амбициозно, но вот чего я хочу достичь:
У меня есть класс, который держит мой горячий Observable
, классу требуется некоторое время, чтобы подготовить его правильно (создать его в другом месте и получить ссылку), поэтому, когда другой класс запрашивает его, ссылка может быть все еще нулевой (вызывая нулевой указатель). Я пытаюсь добиться того же, что и для шаблона NullObject: вернуть пустую наблюдаемую (вместо нулевой) информацию, на которую можно безопасно подписаться, и, когда Observable создана должным образом, начинает испускать элементы.
Единственный способ решить это - создать PublishSubject
который действует как мост между клиентскими классами и классом ObservableHolder. Ссылка PublishSubject всегда возвращается клиенту, и когда Observable
готов он просто перенаправит все события в тему. Это хорошее решение? Или это можно сделать лучше?
@редактировать
Я решил остаться с моим решением, я думаю, после того, как завернуть его в класс, это достаточно хорошее решение. Я проголосовал за ответ ниже, однако он не соответствует моей проблеме, потому что он не имеет прямого отношения к rx-java
реализация, однако, предполагающая, что образец прокси был полезен.
1 ответ
Я думаю, что вы ищете, называется прокси-шаблон.
Прокси - это (как следует из названия) объект, который заменяет другой объект, который в данный момент недоступен.
Вы можете реализовать это, используя java.util.Observable
в этом случае
public class ObservableProxy extends Observable {
private ObservableProxyAdapter observableProxyAdapter = new ObservableProxyAdapter();
private Observable target;
public void setTarget(Observable target) {
if(this.target != null){
// if this proxy was connected to an observer... disconnect
this.target.deleteObserver(observableProxyAdapter);
}
this.target = target;
if(this.target != null){
// If a new target is set... connect to it
this.target.addObserver(observableProxyAdapter);
}
}
private class ObservableProxyAdapter implements Observer {
public void update(Observable o, Object arg) {
// forward notifications from the target
setChanged();
notifyObservers(arg);
}
}
}
Вы раздаете ObservableProxy
клиентам. Клиенты могут зарегистрироваться на ObservableProxy
, Позже, когда станет доступным "реальный" Observable, вы можете установить его в качестве цели ObservableProxy
, Прокси регистрируется как Observer
к цели и направляет уведомления наблюдателям.
+-----------------+ notify +---------------+ notify +--------------+
| real observable | ------> | proxy adapter | ------> | observables |
+-----------------+ +---------------+ | of proxy |
+--------------+
Вот пример приложения
public class ObservableProxyTest {
public static void main(String[] args) {
ObservableProxy observableProxy = new ObservableProxy();
Observer someObserver = new Observer() {
public void update(Observable o, Object arg) {
System.out.println(arg);
}
};
observableProxy.addObserver(someObserver);
// Later the real observer becomes available
RealObservable realProxy = new RealObservable();
observableProxy.setTarget(realProxy);
// notifications will be forwarded
realProxy.notifyHello();
}
private static class RealObservable extends Observable {
public void notifyHello(){
setChanged();
super.notifyObservers("Hello World");
}
}
}