android – 如何使用RxJava实现NullObject模式

是的,这可能听起来有点雄心勃勃,但这就是我想要实现的目标:

我有一个包含我的热Observable的类,它需要一些时间来准备它(在另一个地方创建它并获得引用),所以当另一个类请求它时,引用可能仍然为null(导致nullpointer).我想要实现的是类似于NullObject模式:返回空的observable(而不是null),可以安全地订阅,并且当正确创建Observable时,开始发出项目.

解决它的一种方法是创建PublishSubject,它充当客户端类和ObservableHolder类之间的桥梁. PublishSubject引用总是返回给客户端,当Observable准备就绪时,它只会将所有事件转发给subject.这是一个好的解决方案吗?或者它可以做得更好?

@编辑

我决定继续使用我的解决方案,我认为在课堂上将它包装好后,它就足够了.我赞成以下答案,但它不符合我的问题,因为它与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的目标.代理将自身注册为目标的观察者,并将通知转发给它的观察者.

+-----------------+  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");
        }
    }
}
点赞