2017-06-27 5 views
0

として観察できるRxJavaたちは、クラスのフィールドとして観測可能rxjavaがあるとします。クラスフィールド

public class MyClass { 

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

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

この場合、クラスのクライアントに共有されている、観察の1つのインスタンスのみがあります。

public class MyClass{ 

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

私のコードベースに、私が作成され、メソッドの呼び出しで返されたものの観測がたくさんあるので、私は聞いてるのよ:常に新しい観測可能なインスタンスを返すときに、パフォーマンスのヒットについてどう

。 返されるクラスインスタンスを作成するのは良い考えですか?

+0

リターンをmyObservable。常に同じインスタンスを返す、何が問題なの?あなたの答えは – paul

答えて

1

パフォーマンス面で大きな違いはないと思います。とにかく私は最初の実装で問題があると思う:Observableから放出されるアイテムとして常に1を使用するつもりはないと思う。おそらく、実際には、次のようなものが欲しいでしょう:

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が印刷されることを期待するが、何あなたが得ることはあなたが変数myObservableにごObservable.just(value)を割り当てるときに、あなたがその意志値を固定しているので、これは二重の100です。常に放出される。

あなたはdefer演算子を使用することができ、これを防止するために:

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

をだから今、観測可能から放射されたアイテムは、サブスクリプションの瞬間にあなたの変数の値になります。

注:fromCallable演算子使用して同じ結果を得ることができます。

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

Thxです。実際、私のコードベースのObservablesはこの例より複雑です。私はObservablesを常にゼロから作成するのではなく、フィールドを使用する方がパフォーマンスが良いのかどうか疑問に思っていました。 – juxeii

関連する問題