是的,这听起来有点雄心勃勃,但这是我想要实现的目标:
我有一个类保存我的热Observable
,类需要一些时间来正确准备它(在另一个地方创建它并获得引用),所以当另一个类要求它时,引用可能仍然为空(导致空指针)。我想要实现的是类似于 NullObject 模式:返回可以安全订阅的空可观察对象(而不是 null),并且当 Observable 被正确创建时开始发射项目。
解决它的一种方法是创建 PublishSubject
,它充当客户端类和 ObservableHolder 类之间的桥梁。 PublishSubject 引用总是返回给客户端,当 Observable
准备就绪时,它会将所有事件转发给 subject。这是一个好的解决方案吗?或者可以做得更好?
@edit
我决定保留我的解决方案,我认为在将其包装在类里面后,它已经足够好了。我赞成下面的答案,但是它与我的问题不匹配,因为它与 rx-java
实现没有直接关系,但是建议代理模式很有帮助。
最佳答案
我猜你要找的是 proxy pattern .
代理(顾名思义)是一个替代当前不可用的另一个对象的对象。
您可能希望以这种方式使用 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
,并将通知转发给它的 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");
}
}
}
关于android - 如何使用 RxJava 实现 NullObject 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33628850/