Observable
従来のJavaイベントパターンからRx-Javaを作成する最良の方法は何ですか? つまり、
class FooEvent { ... }
interface FooListener {
void fooHappened(FooEvent arg);
}
class Bar {
public void addFooListener(FooListener l);
public void removeFooListener(FooListener l);
}
実装したい
Observable<FooEvent> fooEvents(Bar bar);
私が思いついた実装は次のとおりです。
Observable<FooEvent> fooEvents(Bar bar) {
return Observable.create(new OnSubscribeFunc<FooEvent>() {
public Subscription onSubscribe(Observer<? super FooEvent> obs) {
FooListener l = new FooListener() {
public void fooHappened(FooEvent arg) {
obs.onNext(arg);
}
};
bar.addFooListener(l);
return new Subscription() {
public void unsubscribe() {
bar.removeFooListener(l);
}
};
}
});
}
しかし、私はそれがあまり好きではありません:
非常に冗長です。
ごとにリスナー
Observer
が必要です (理想的には、オブザーバーがない場合はリスナーがなく、それ以外の場合は 1 つのリスナーが必要です)。これは、オブザーバー カウントを のフィールドとして保持し、OnSubscribeFunc
購読時に増分し、購読解除時に減分することで改善できます。
より良い解決策はありますか?
要件:
イベント パターンの既存の実装を変更せずに操作する (そのコードを制御している場合は、
Observable
必要な戻り値を既に記述できます)。ソース API が変更された場合にコンパイラ エラーが発生する。
Object
実際のイベント引数の型の代わりに、またはプロパティ名の文字列を使用しないでください。