RxJava可观察为类字段

时间:2017-06-27 12:19:04

标签: performance class-design rx-java2

假设我们有一个rxjava observable作为类字段:

public class MyClass {

    private final Observable<Integer> myObservable = Observable.just(1);

    public Observable<Integer> getMyObservable() {
        return myObservable;
    }
}

在这种情况下,只有一个observable实例与类客户端共享。

当总是返回一个新的可观察实例时,性能命中如何:

public class MyClass{

    public Observable<Integer> getMyObservable() {
        return Observable.just(1);
    }
}

我问,因为在我的代码库中,我有很多可以在方法调用中创建和返回的observable。 我想知道创建然后返回的类实例是不是一个好主意?

1 个答案:

答案 0 :(得分:1)

我认为在性能方面没有太大差异。无论如何,我在第一个实现中看到了一个问题:我认为你不会使用always 1作为项目​​从Observable发出。实际上,你可能想要这样的东西:

public class MyClass {

    private int value = 100;

    private final Observable<Integer> myObservable = Observable.just(value);

    public Observable<Integer> getMyObservable() {
        return myObservable;
    }
}

我的意思是,我期望发出类的参数,就像在示例中一样。

问题在于,无论变量将采用的下一个值如何,发出的值始终为100。我们来看一个例子:

MyClass mc = new MyClass();
mc.getMyObservable().subscribe(value -> print(value));
mc.setValue(200);
mc.getMyObservable().subscribe(value -> print(value));

您希望打印100和200,但您将得到的是100倍。这是因为当您将Observable.just(value)分配给变量myObservable时,您正在修复将要修改的值总是发出。

为了防止这种情况,您可以使用defer运算符:

private final Observable<Integer> myObservable = Observable.defer(() -> Observable.just(value));

现在,来自observable的发出项将是订阅时变量的值。

注意:使用fromCallable运算符可以获得相同的结果:

private final Observable<Integer> myObservable = Observable.fromCallable(() -> value);