假设我正在用Java编写方法foo(int i)
。由于i
是按值传递的,因此可以安全地在foo
中进行更改。例如
无效foo(int i){我=我+ 1; //更改我...}
在Java中更改方法的参数被认为是好是坏做法?
一般来说,这被认为是不好的作法,尽管有些人在其他答案中却忽略了它。
对于像按值直接传递的基元之类的参数,覆盖原始变量没有任何好处。在这种情况下,您应该按照@João的建议进行复印。
对于通过值(对象)传递其reference的参数,如果修改句柄以指向另一个对象,那将造成混乱。这一点更加重要,因为修改作为参数传递的对象的内容也会修改原始对象。
如果替换了句柄引用的对象,然后修改its内容,则不会替换调用者中原始引用所引用的对象,但是阅读代码的人可能希望将其替换。
而如果您不替换对象,而是修改内容,则方法calling您的方法可能不会期望此更改。通常,此类别属于与安全性相关的不良做法。
这只是个人见解,但我认为对于其他可能稍后在该代码中使用original参数值的人,可能会感到困惑,并且可能不会注意到它已被更改。
另外,简单地创建另一个变量并为其分配修改后的值(即int j = i + 1
)很便宜。
因为我被值传递了,所以可以安全地更改它
foo()
即使通过对象引用也是绝对安全的,因为它们是本地的:即,将新引用分配给本地引用不会对调用代码中的原始引用产生任何影响
这是您的个人选择。但是,我不会更改参数值,因为可能会丢失传递给此方法的实际值的轨迹。
中性。但是,许多人认为将方法更改为:
void foo(final int i) {
int j = i + 1; // not change i
...
}
无论哪种方式都可以工作。
取决于上下文。我倾向于“不良做法”,原因有两个:
wo n't
会被修改-这可能是预期的,也可能不是预期的。如果您创建对该参数的另一个引用并更改新引用的状态,则该参数的引用will会更改-also可能是预期的,也可能不是预期的。i = i + 1;
并不会真正改变i。它只会更改您的i
本地副本(换句话说,调用代码中的i
不会更改)。基于此,这是可读性的问题,并且通过遵守the POLS (Principle Of Least Surprise)来避免代码中的意外行为。
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;