Возможно, я нашел приемлемый способ обойти это. Кажется, что мне нужно сделать, это двойное связывание вне самого экземпляра Observable. Например. Мне нужен DbObservable и DbOnSubscribe пару, которая рассчитывает друг на друга, что-то вроде этого:
DbObservable класс:
public class DbObservable<T> extends Observable<T> {
//Some parameter
private String sql;
protected DbObservable(DbOnSubscribe<T> onSub) {
super(onSub);
}
//Getter for DbOnSubscribe
public String getSql() {
return sql;
}
//Chain parameter modifier
public DbObservable<T> sql(String sql) {
this.sql = sql;
return this;
}
}
DbOnSubscribe класс:
public class DbOnSubscribe<T> implements Observable.OnSubscribe<T> {
private DbObservable<T> dbObservable;
@Override
public void call(Subscriber<? super T> subscriber) {
String sql = dbObservable.getSql(); //Access SQL param
subscriber.onNext((T) sql); //Use subscriber
subscriber.onCompleted();
}
//Set back-reference
public void setDbObservable(DbObservable<T> dbObservable) {
this.dbObservable = dbObservable;
}
}
И, наконец, наш предполагается класс DbConnector:
public class DbConnector {
public DbObservable<String> getObservable() {
DbOnSubscribe<String> onSub = new DbOnSubscribe<String>();
DbObservable<String> obs = new DbObservable<>(onSub);
onSub.setDbObservable(obs);
return obs;
}
}
Поэтому, когда я пробую ...
public class DbObservableTest {
public static void main(String[] args) {
DbConnector srcDb = new DbConnector();
srcDb.getObservable()
.sql("some SQL")
.subscribe(System.out::println);
}
}
... это действительно работает! Он печатает «некоторый SQL».
Заключение
- Если вы хотите быть супер-чистым и не против одного или 2 дополнительных строк кода, идти на строитель, как предложил Джоэл и Тассосом Bassoukos.
- Если вы не боитесь немного более сложного кода (который всегда должен быть инкапсулирован где-то), и вы действительно хотите, чтобы эти параметры находились внутри вашего собственного наблюдаемого, вы можете попробовать двойное связывание.
- опции?
Вы не можете легко добавить свой собственный метод в ядро Rx API, однако то, что вы можете сделать, это написать свои собственные строители с тем же самым стилем беглого написания и заставить этих строителей вернуться к наблюдаемому в конце. Сделав это, вы сможете свободно писать. – Joel