为什么一个方法(不)应该既是访问器又是修改器?
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 以前的值没有任何危害,因为它实际上可以免费实现,并且会使某些习语的速度提高一倍。
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 以前的值没有任何危害,因为它实际上可以免费实现,并且会使某些习语的速度提高一倍。