Как получить шаблон 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");
        }
    }
}
Другие вопросы по тегам