问题 修改传递给方法的对象的最佳做法是什么?


将对象传递给方法后,我想更改其中一个字段。在Java中执行此任务的最佳做法是什么?


8900
2018-03-04 10:00


起源



答案:


简单的回答

如其他答案所述,您只需调用setter方法即可。

更哲学的答案

通常,在创建它们之外的范围内变异对象可能很危险:

http://en.wikipedia.org/wiki/Functional_programming

也就是说,有时你只想在同一逻辑范围内封装一些逻辑,你想要修改传入的对象的值。所以我将使用的规则是 只要所有调用代码都充分意识到这种突变,您可以在传递对象的方法中调用对象上的setter方法(如果没有,则应创建一个setter方法)。

通常,如果您调用一个函数来改变代码库中多个位置的参数,您会发现它变得越来越容易出错,这就是函数式编程得到回报的原因。

所以,故事的寓意是:如果你的来电者完全了解这种突变,那么你 可以 更改方法中的值,但通常您应该尝试避免它,而是在创建它的范围内更改它(或创建副本)。


13
2018-03-04 10:17



很少使用输出参数的+1,如果有的话。通常,您需要良好的输出参数文档,甚至不能保证该方法的用户都知道这一事实。 - Thomas


答案:


简单的回答

如其他答案所述,您只需调用setter方法即可。

更哲学的答案

通常,在创建它们之外的范围内变异对象可能很危险:

http://en.wikipedia.org/wiki/Functional_programming

也就是说,有时你只想在同一逻辑范围内封装一些逻辑,你想要修改传入的对象的值。所以我将使用的规则是 只要所有调用代码都充分意识到这种突变,您可以在传递对象的方法中调用对象上的setter方法(如果没有,则应创建一个setter方法)。

通常,如果您调用一个函数来改变代码库中多个位置的参数,您会发现它变得越来越容易出错,这就是函数式编程得到回报的原因。

所以,故事的寓意是:如果你的来电者完全了解这种突变,那么你 可以 更改方法中的值,但通常您应该尝试避免它,而是在创建它的范围内更改它(或创建副本)。


13
2018-03-04 10:17



很少使用输出参数的+1,如果有的话。通常,您需要良好的输出参数文档,甚至不能保证该方法的用户都知道这一事实。 - Thomas


请注意,即使对象作为最终传递,它仍然可以更改。您无法重新分配变量,这通常是(输入/)输出参数所需的。

以Jigar Joshis为例:

public void increasePersonAgeByOneMonth(final Person p ){
  p = new Person(); //this won't work, which is ok since otherwise the parameter itself would not be changed by the next method
  p.setAge(((p.getAge()*12.0) + 1)/12.0); //ok
}

0
2018-03-04 10:17