假设我在Java中编写方法foo(int i)
由于i
是按值传递的,因此可以安全地在foo
中更改它。例如
void foo(int i) { i = i + 1; // change i ... }
在Java中更改方法的参数是否被认为是好的或坏的做法?
答案 0 :(得分:13)
一般来说这被认为是不好的做法,尽管有些人会忽略它,你可以在其他答案中看到。
对于通过值直接传入的基元等参数,覆盖原始变量没有任何优势。在这种情况下,您应该按照@João建议复制。
对于通过值(对象)传入引用的参数,如果修改句柄以指向其他对象,则完全令人困惑。这一点更为重要,因为修改作为参数传递的对象的内容也会修改原始对象。
如果替换句柄引用的对象,然后修改其内容,则不会修改原始对象,但是读取代码的人可能会想到它。
如果您不替换对象并修改内容,那么调用方法的方法可能不会期望此更改。此类别通常属于与安全相关的不良做法。
答案 1 :(得分:4)
这仅仅是个人意见,但我认为对于那些可能希望稍后在该代码中使用原始参数值的其他人而言可能会感到困惑,并且可能不会注意到它已经被更改
另外,简单地创建另一个变量并为其赋予修改后的值(即int j = i + 1
)是很便宜的。
答案 2 :(得分:2)
Since i is passed by value it is safe to change it in
即使传递对象引用也是绝对安全的,因为它们是本地的,即分配对本地obj引用的新引用不会对调用代码中创建的原始对象产生任何影响
这是您个人的选择。但是我不会更改参数值,因为可能会忽略传递给此方法的实际值的轨迹。
答案 3 :(得分:1)
重要的是要注意i = i + 1;
并没有真正改变我。它只会更改i
的本地副本(换句话说,调用代码中的i
不会更改。)
基于此,遵循the POLS (Principle Of Least Surprise)是一个可读性问题并避免代码中的意外行为。
答案 4 :(得分:1)
中性。但是,许多人将这种方法改为:
,这被认为是更好的做法void foo(final int i) {
int j = i + 1; // not change i
...
}
随意工作。
答案 5 :(得分:1)
取决于具体情况。我倾向于“糟糕的做法”,原因有两个:
当它是参考值时会弹出第三个问题。如果您修改参数引用以指向其他内容并更改其状态,则原始将不会被修改 - 这可能是也可能不是预期的。如果您创建另一个参数引用并更改新引用的状态,则参数的引用将更改 - 也可能是也可能不是。
答案 6 :(得分:-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;