Каков наилучший способ создания Rx-Java Observable
из классического шаблона событий 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
(в идеале не должно быть ни одного слушателя, если в нем нет наблюдателей, а один слушатель - в противном случае). Это можно улучшить, сохранив счетчик наблюдателей в качестве поля вOnSubscribeFunc
, увеличивая его на подписку и декремент при отписании.
Есть ли лучшее решение?
Требования:
-
Работа с существующими реализациями шаблонов событий без их изменения (если бы я контролировал этот код, я мог бы уже записать его для возврата
Observable
, который мне нужен). -
Получение ошибок компилятора, если/при изменении исходного API. Не работает с
Object
вместо фактического типа аргумента события или с строками имен свойств.