假设我写的方法foo(int i)
Java编写的。
由于i
是按值传递是安全的改变它在foo
。 例如
void foo(int i) { i = i + 1; // change i ... }
难道它认为好或不好的做法,改变方法的参数在Java中?
假设我写的方法foo(int i)
Java编写的。
由于i
是按值传递是安全的改变它在foo
。 例如
void foo(int i) { i = i + 1; // change i ... }
难道它认为好或不好的做法,改变方法的参数在Java中?
它被认为是一般不好的做法,虽然有些人忽视了它,你可以在其他的答案见。
对于像由值直接传递在原语参数,存在覆盖原来的变量没有优势。 在这种情况下,你应该做一个副本由@若昂的建议。
为参数,其参考是由值(对象)传递,如果修改的句柄指向一个不同的对象,即透顶混乱。 这是更为重要,因为修改作为参数传递的对象的内容将修改原来的对象了。
如果更换的手柄所指的对象,然后修改其内容,原来的对象将不会被修改,但有人读代码可能会希望它是。
而如果你不更换对象,并修改内容, 调用你的方法,该方法可能不希望这种变化。 这一类通常来自在与安全相关的不良做法。
这仅仅是个人意见,但我认为它可以为可能要在后面的代码使用原来的参数值,其他人混淆,并且可能没有注意到,它已经被改变了。
另外,它的价格便宜简单地创建另一个变量,并为其分配修改值(即, 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
...
}
随意的工作无论哪种方式。
依赖于上下文。 我倚向“不好的做法”,原因有二:
第三个问题弹出当它是一个参考值。 如果修改在别的什么参数参考点,并改变其状态,原来不会被修改,这可能会或可能不会有什么打算。 如果你创建另一个参考参数和更改新基准的状态,参数的引用将被改变,这也可能是也可能不是什么打算。
我不是一个真正的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;