4

ええ、それは少し野心的に聞こえるかもしれませんが、私が達成したいことは次のとおりです。

クラスがObservableそれを正しく準備する (別の場所で作成して参照を取得する) のに時間がかかるため、別のクラスがそれを要求すると、参照がまだ null である可能性があります (nullpointer が発生します)。私が達成しようとしているのは、NullObject パターンに似ています。安全にサブスクライブできる空のオブザーバブル (null ではなく) を返し、Observable が作成されると、アイテムの放出を適切に開始します。

それを解決する 1 つの方法はPublishSubject、クライアント クラスと ObservableHolder クラスの間のブリッジとして機能するものを作成することです。PublishSubject 参照は常にクライアントに返され、Observable準備ができたらすべてのイベントをサブジェクトに転送します。それは良い解決策ですか?それとももっとうまくできるでしょうか?

@編集

私は自分のソリューションにとどまることにしました。クラスにラップした後、それで十分なソリューションだと思います。以下の回答に賛成しましたが、rx-java実装に直接関係していないため、私の問題とは一致しませんが、プロキシパターンが役立つことを示唆しています。

4

1 に答える 1

1

あなたが探しているのは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ターゲットに登録し、通知をオブザーバーに転送します。

+-----------------+  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");
        }
    }
}
于 2015-11-10T19:26:40.187 に答える