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

假设我在Java中编写方法foo(int i)
因为i通过值传递,所以在foo更改它是安全的。 例如

 void foo(int i){
    i = i + 1;  //改变我
    ...
 }

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

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

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

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

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

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

这只是个人观点,但我认为对于那些可能希望稍后在该代码中使用原始参数值的人来说可能会让人感到困惑,并且可能不会注意到它已经被更改了。

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

Since i is passed by value it is safe to change it in

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

这是您个人的选择。 但是我不会更改参数值,因为可能会松开传递给此方法的实际值的轨道。

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

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

中性。 但是,许多人将这种方法改为:

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

随意工作。

取决于背景。 我倾向于“糟糕的做法”,原因有两个:

  1. 有些人可能会认为原来的价值正在改变。
  2. 可能使代码更难以推理(用适当短的方法缓解)。

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

我不是一个真正的java专家,但是如果你正在编写一个方法来在对象中存储某种状态,你应该在一个对象中有一个私有变量,并将一个值传递给该方法并将其存储在私有变量中。 你可以用构造函数初始化它并有一个

void fooSetWhatever(int i) { privateInt = i }

并有一个

int i fooGetWhatever () { return privateInt; }

如果你想加/减值

void fooAddToWhatever (int i) { privateInt += i; }

// can't remember if java likes +=, you could do privateInt = privateInt + i;