多分私はこれを受け入れる方法を見つけました。私がここで行う必要があるのは、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"を表示します。あなたはスーパークリーンになりたいと、コードの1本のまたは2の余分なラインを気にしない場合はジョエルとTassos Bassoukosによって提案されているように、ビルダーのために行く
結論
- 。
- あなたは(常にどこかにカプセル化されなければならない)もう少し複雑なコードを恐れていないよ、あなたは本当にこれらのパラメータは、あなた自身の観察可能な内になりたい場合は、任意のより多くの
- 二重結合の方法を試すことができますオプション?
コアRx APIに独自のメソッドを簡単に追加することはできませんが、できることは同じ種類の流暢な記述スタイルで独自のビルダーを作成し、最後に観察者を返すようにすることです。そうすることで、この流暢な文章を残すことができます。 – Joel