RxJava-何时不使用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>,客户端就少了一个单子来处理一些始终不变的东西。

然而,也许我失去了灵活性,应该使用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设计师讲述他们的体验会很有趣。

相关内容

  • 没有找到相关文章

最新更新