17

假设我正在foo(int i)用 Java 编写一个方法。
由于i是按值传递的,因此可以安全地将其更改为foo. 例如

无效富(int i){
   我 = 我 + 1; // 改变我
   ...
}

在 Java 中更改方法的参数被认为是好的还是坏的做法?

4

6 回答 6

23

一般来说,这被认为是不好的做法,尽管有些人会忽略它,正如您在其他答案中看到的那样。

对于像原语这样直接按值传入的参数,覆盖原始变量没有任何好处。在这种情况下,您应该按照@João 的建议进行复制。

对于通过值(对象)传递引用的参数,如果您修改句柄以指向不同的对象,那将是非常混乱的。这更重要,因为修改作为参数传递的对象的内容也会修改原始对象。

如果替换句柄引用的对象,然后修改内容,调用者中原始引用所引用的对象将不会被替换,但阅读代码的人可能会期望它会被替换。

然而,如果您不替换对象并修改内容,则调用您的方法的方法可能不会期望此更改。此类别通常属于与安全相关的不良做法。

于 2012-08-18T16:05:27.283 回答
8

这只是个人意见,但我认为这可能会让其他人感到困惑,因为他们可能希望稍后在该代码中使用原始参数值,并且可能没有注意到它已经被更改。

另外,简单地创建另一个变量并为其分配修改后的值(即int j = i + 1)是很便宜的。

于 2012-08-18T15:56:34.303 回答
3

由于 i 是按值传递的,因此更改它是安全的foo()

即使传递对象引用也是绝对安全的,因为它们是本地的:即,为本地引用分配新引用不会对调用代码中的原始引用产生任何影响

这是你个人的选择。但是,我不会更改参数值,因为可能会丢失传递给此方法的实际值的跟踪。

于 2012-08-18T16:02:37.260 回答
2

需要注意的是,它i = i + 1;并没有真正改变 i。它只会更改您的本地副本i(换句话说,i调用代码中的 不会更改)。

基于此,通过遵守POLS(最小惊喜原则) ,这是一个可读性和避免代码中意外行为的问题。

于 2012-08-18T15:57:37.210 回答
1

中性的。但许多人认为将方法更改为:

void foo(final int i) {
    int j = i + 1; // not change i
    ...
}

随意工作。

于 2012-08-18T15:57:39.590 回答
1

取决于上下文。我倾向于“不良做法”,原因有两个:

  1. 有些人可能会认为原始值正在被更改。
  2. 可能使代码更难推理(通过适当简短的方法减轻)。

当它是参考值时,会弹出第三个问题。如果您修改参数引用以指向其他对象并更改其状态,则原始参数不会被修改——这可能是也可能不是预期的。如果您创建对参数的另一个引用并更改新引用的状态,则参数的引用被更改——这可能是也可能不是预期的。

于 2012-08-18T15:58:13.740 回答