reactive-programming - RxJava- 何时不使用 Observable?

标签 reactive-programming rx-java

我在使用 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/

相关文章:

java - Observable.zip 问题

Android - 改造 - 基本网址中缺少查询参数

rxjs - Reactive-Extension 和 ReactiveX 有什么关系

javascript - Meteor - 从子助手访问父模板变量

javascript - 当构造函数中存储更新时,不会调用 react ;

java - 如何在 RxJava 2 中使用 Flowable?

android - Retrofit & RxJava 多个请求完成

java - android.os.NetworkOnMainThreadException 在 android 上使用 rxjava

android - 在 Android 上的 RxJava2 中结合 Singles 的最佳方式?

ios - RxSwift : Error 'Type ' inout UITapGestureRecognizer' does not conform to protocol 'ReactiveCompatible'