为什么一个方法(不)应该既是访问器又是修改器?

Why should a method (not) be both accessor and mutator?

JDK 中的许多 Java 方法,例如 List.set()Map.put() 都更改对象和 return 结果,而不是保留 mutator 和存取器分开。

在我看来,对于这些方法中的大多数,return 值更多的是副作用,使用单独的方法来检索它是没有意义的。

但除此之外,每种方法还有其他优点和缺点吗?我如何决定哪种方式更合适?

例如,我正在创建一个模拟器对象,调用 runSimulation() 方法,我需要 boolean 结果。我可以将它存储在模拟器对象中,然后 return 它在一个单独的访问器方法中调用,或者 return 它在 mutator 本身中,就像我现在所做的那样。

除非 运行Simulation() 是一种阻塞方法并且您想 运行 异步地让它不阻塞您的主线程,否则 returning 没有坏处使用与创建模拟相同的方法得到结果,只要 returning 它可以便宜地完成。

有时这是一个方便的问题:您的对象设计是否让用户几乎总是在 creating/running 模拟后请求结果?那么,return 变异方法中的结果可能是个好主意(也许您可以将方法命名为 "runSimulationForResult()")。

有时这是一个效率问题:对于某些类型的 List 实现(LinkedList 等),调用 get() 后跟 set() 意味着列表被遍历两次而不是一次,即使它可能不会是一个超级常见的模式,设计者认为 return 以前的值没有任何危害,因为它实际上可以免费实现,并且会使某些习语的速度提高一倍。