我在使用RxJava时遇到了一个场景,我不太确定我应该使用Observable<T>
还是最终ImmutableList<T>
。
基本上,如果我导入一个最终的不可变数据集一次,再也没有,我真的应该把它暴露为一个冷Observable<T>
吗?
public final class StrategyManager {
private static final StrategyManager instance = new StrategyManager();
private final ImmutableList<Strategy> strategies;
private StrategyManager() {
strategies = //import from db
}
public Observable<Strategy> getStrategies() {
return Observable.from(strategies);
}
public static StrategyManager get() {
return instance;
}
}
或者我应该将它暴露为ImmutableList<T>
?
public final class StrategyManager {
private static final StrategyManager instance = new StrategyManager();
private final ImmutableList<Strategy> strategies;
private StrategyManager() {
strategies = //import from db
}
public ImmutableList<Strategy> getStrategies() {
return strategies;
}
public static StrategyManager get() {
return instance;
}
}
如果我将它公开为ImmutableList<T>
,客户端就少了一个单子来处理一些始终不变的东西。
然而,也许我失去了灵活性,应该使用Observable<T>
。例如,我可以决定使用RxJava-JDBC在每次调用时直接查询数据,而不需要任何缓存。或者我可以设置cache()
甚至replay()
,这样数据就可以过期并释放内存。
public final class StrategyManager {
private static final StrategyManager instance = new StrategyManager();
private final Observable<Strategy> strategies;
private Database db = null;
private StrategyManager() {
strategies = db.select("SELECT * FROM STRATEGY")
.autoMap(Strategy.class)
.replay(1, TimeUnit.MINUTES)
.autoConnect();
}
public Observable<Strategy> getStrategies() {
return strategies;
}
public static StrategyManager get() {
return instance;
}
}
所以我的问题是,有没有不使用Observable
的情况?或者在响应式应用程序中,我是否应该始终使用Observable
,即使是不变的数据集?我是否应该使用后者来实现灵活性和容易改变的行为?
我喜欢这个问题。我想在使用响应式API的决定中涉及到很多因素,没有明确的是或否的答案,只是对未来可能发生的事情的判断。
我应该总是使用一个可观察对象,即使恒定的数据集不会改变?
如果你想要最大的灵活性,不要介意给客户端增加使用RxJava的负担,不要介意调试困难(你已经看到了很长的RxJava堆栈跟踪),然后使用Observable。请注意,即使对于"不会改变的恒定数据集",您的内存约束也可能发生变化,并且大数据集可能不再适合保存在内存中。
另一件要记住的事情是,可观察对象确实有一些处理开销(对于链中的每个操作符,可能对每个发射都有volatile读),所以出于性能原因,有时不使用它是好的。
你的用例,你的数据和你的基准将真正决定你走哪条路。
如果能听到Netflix(和其他任何地方)的API设计师讲述他们的体验会很有趣。