【发布时间】:2015-11-26 09:56:49
【问题描述】:
我知道你应该不惜一切代价避免这种情况,但是如果我有一个 RxJava 中的子类 Observable 的有效用例怎么办?可能吗?我该怎么做?
在这种特定情况下,我有一个当前返回请求的“存储库”类:
class Request<T> {
public abstract Object key();
public abstract Observable<T> asObservable();
[...]
public Request<T> transform(Func1<Request<T>, Observable<T>> transformation) {
Request<T> self = this;
return new Request<T>() {
@Override public Object key() { return self.key; }
@Override public Observable<T> asObservable() { return transformation.call(self); }
}
}
}
然后我在需要请求密钥(如缓存)的上下文中使用转换方法修改响应可观察(asObservable):
service.getItemList() // <- returns a Request<List<Item>>
.transform(r -> r.asObservable()
// The activity is the current Activity in Android
.compose(Operators.ensureThereIsAnAccount(activity))
// The cache comes last because we don't need auth for cached responses
.compose(cache.cacheTransformation(r.key())))
.asObservable()
[... your common RxJava code ...]
现在,如果我的 Request 类是 Observable 子类会非常方便,因为这样我可以消除所有 .asObservable() 调用,客户甚至不需要知道我的 Request 类。
【问题讨论】:
-
如果你确定你真的想把事情弄得这么乱:github.com/ReactiveX/RxJava/wiki/Creating-Observables,但上面的代码似乎混淆了问题。
-
我在 subclassing Observables 上找不到任何参考。我错过了什么吗?
-
Observable 可能不打算被子类化。记住 Effective Java 第 16 条:优先考虑组合而不是继承。为什么你认为子类化在这里是正确的?
-
但是 RxJava 中有 ConnectableObservable。
-
引用第 16 条的介绍:“继承是实现代码重用的强大方法,但它并不总是最好的工具。使用不当会导致软件脆弱。它是安全的在包中使用继承,其中子类和超类的实现在同一个程序员的控制下。在扩展专门设计和记录的类时使用继承也是安全的(第 17 条)。跨包继承普通的具体类然而,边界是危险的。”
标签: rx-java