我在使用 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>
,客户少了一个 monad 来处理一些永远不变的事情。但是,也许我失去了灵活性,应该使用
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
的情况? ?或者在响应式(Reactive)应用程序中,我应该总是使用 Observable
即使对于不会改变的恒定数据集?我应该使用后者以获得灵活性和容易改变的行为吗?
最佳答案
我喜欢这个问题。我认为决定使用响应式(Reactive) API 涉及很多因素,没有明确的"is"或“否”答案,只是对 future 可能发生的事情的判断。
should I always use an Observable even for constant data sets that will not change?
如果你想要最大的灵活性,不要介意使用 RxJava 给客户端带来负担,不要介意调试困难(你已经看到了很长的 RxJava 堆栈跟踪),然后使用 Observable。请注意,即使对于“不会更改的常量数据集”,您的内存限制也可能会发生变化,并且大型数据集可能不再适合保存在内存中。
要记住的另一件事是,Observables 确实有一些处理开销(链中可能每个操作符的每次发射的 volatile 读取),因此出于性能原因,有时不使用它是好的。
你的用例、你的数据和你的基准将真正决定你走哪条路。
从 Netflix(和其他任何地方)的 API 设计师那里听到他们的经验会很有趣。
关于reactive-programming - RxJava- 何时不使用 Observable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32668821/