在Java中更改参数是一个好习惯

Mic*_*ael 10 java pass-by-value

假设我正在foo(int i)用Java 编写一个方法.
由于i通过值传递,因此可以安全地更改它foo.例如

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

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

Raj*_*ani 15

一般来说这被认为是不好的做法,尽管有些人会忽略它,你可以在其他答案中看到.

对于通过值直接传入的基元等参数,覆盖原始变量没有任何优势.在这种情况下,您应该按照@João的建议制作副本.

对于通过值(对象)传入引用的参数,如果修改句柄以指向其他对象,则完全令人困惑.这一点更为重要,因为修改作为参数传递的对象的内容也会修改原始对象.

如果替换句柄引用的对象,然后修改内容,则不会修改原始对象,但是读取代码的人可能会期望它.

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

  • 是的,我阅读了该主题的所有论据,但我仍然认为您选择的措词比帮助更令人困惑。我改写了答案,所以现在让我知道是否可以。 (3认同)
  • 否。它始终是按值传递(或“按值调用”)。Java中唯一的类型是原始类型和引用类型。因此,唯一的值是基元和引用,两者均通过值传递。与C ++不同,您不能有一个变量的值“是”一个对象。您只能有一个变量,其值是指向对象的引用。您对对象所做的所有事情都必须通过引用来完成-`new SomeClass()`会计算为引用;字段和方法访问使用参考。那就是“对象不是价值”的意思。您不能“传递”对象。 (2认同)

Joã*_*lva 7

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

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

  • @CaptainGiraffe 真的。但是恶作剧使理解方法比它必须更难,并且区分传入和(无论出于何种原因)更改的值*可以*有助于理解。 (4认同)
  • 我个人的看法和你的不一样。不了解您正在更改的方法是不好的。 (3认同)