RxJava-什么时候不使用 Observable?

RxJava- When not to use an Observable?

我在使用 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 的情况?或者在反应式应用程序中,即使对于不会更改的常量数据集,我是否应该始终使用 Observable?我应该使用后者来获得灵活性和轻松改变行为,我说得对吗?

我喜欢这个问题。我想有很多因素决定使用反应式 API 并且没有明确的是或否答案,只是对未来可能会发生什么的判断。

should I always use an Observable even for constant data sets that will not change?

如果你想要最大的灵活性,不介意使用 RxJava 给客户端带来负担,不介意调试困难(你已经看到了很长的 RxJava 堆栈跟踪)然后使用 Observable。请注意,即使是 "constant data set that will not change",您的内存限制也可能会发生变化,并且大型数据集可能不再适合保存在内存中。

另一件要记住的事情是 Observables 确实有一些处理开销(链中可能每个操作员的每次发射的易变读取)所以出于性能原因有时最好不要使用。

您的用例、数据和基准将真正决定您的前进方向。

听听 API Netflix(以及其他任何地方)的设计师讲述他们的经历会很有趣。