为什么不建议在一个管道中修改对象

1 rx-java rx-java2

我有一个关于 RxJava 的一般性问题。我在很多地方看到说完全不建议在一个管道步骤中修改对象。您应该创建一个新的并将其传递下去,或doOnNext()用于副作用。

例如

 Observable.fromIterable(users)
        .map(user -> {
            user.name =//do something with name);
            user.age = // do something with age);
            return user;
        }).subscribe(user -> {

        });
Run Code Online (Sandbox Code Playgroud)

如您所见,用户对象正在管道步骤中被修改。但是这段代码运行良好,没有任何问题。但是为什么它被认为是一种不好的做法呢?任何人都可以更好地解释为什么对象在整个流中应该是不可变的?

Kis*_*kae 5

因为无法保证这些对象的来源不会重用它们。例如,如果您使用publish运算符,则所有内部可观察对象都将收到相同的对象。原始来源也可能会尝试重用对象,因此在不应该发生的情况下发生了变异。

为了减少发生这种情况的机会,建议在管道内转换时创建新对象。