假设我正在Java中编写一个名为
由于
foo(int i)
的方法。由于
i
是按值传递的,因此在foo
中更改它是安全的。例如:
void foo(int i) { i = i + 1; // 改变i的值 ... }
在Java中更改方法参数被认为是良好还是不良实践?
foo(int i)
的方法。i
是按值传递的,因此在foo
中更改它是安全的。例如:
void foo(int i) { i = i + 1; // 改变i的值 ... }
在Java中更改方法参数被认为是良好还是不良实践?
虽然一些人会忽略这一点,但总的来说,这被认为是不好的做法。对于像原始类型这样通过传值直接传递的参数,覆盖原始变量没有任何优势。在这种情况下,建议像@João那样制作一份副本。
对于传递其引用按值(对象)的参数,如果修改句柄以指向不同的对象,那就非常混乱了。这更加重要,因为修改作为参数传递的对象的内容也会修改原始对象。
如果您替换了句柄所引用的对象,然后修改它的内容,则调用方中原始引用所指向的对象将不会被替换,但阅读代码的人可能会期望替换该对象。
而如果您不替换对象,而是修改其内容,则调用您的方法的方法可能不会预期此更改。这类通常属于与安全有关的不良做法。
这只是个人意见,但我认为这可能会令其他想在代码中使用原始参数值的人感到困惑,他们可能没有注意到它已经被更改了。
此外,简单地创建另一个变量并将修改后的值赋给它(即int j = i + 1
)非常便宜。
由于i是按值传递的,所以在
foo()
中更改它是安全的。
即使您传递了对象引用,也是绝对安全的,因为它们是本地的:即将新引用分配给本地引用不会对调用代码中的原始引用产生任何影响。
这是您个人的选择。然而,我不会更改参数值,因为这可能会使人失去传递给此方法的实际值的跟踪。
i = i + 1;
并没有真正改变 i 的值。它只改变了你本地的 i
副本(换句话说,调用代码中的 i
不会改变)。i
,但不会改变作为参数传递的原始值,该参数不一定要被称为 i
,实际上甚至不必是一个变量。 - user207421这取决于上下文。我倾向于认为这是“不良实践”,原因有两个:
第三个问题出现在引用值时。如果您修改参数引用以指向其他内容并更改其状态,则原始内容将不会被修改-这可能是有意的,也可能不是。如果您创建另一个引用以引用该参数并更改新引用的状态,则参数的引用将被更改-这也可能是有意的,也可能不是。
a+1
一样显然。 - user395760中立。但是许多人认为更好的做法是改变方法为:
void foo(final int i) {
int j = i + 1; // not change i
...
}
请随意选择工作方式。
new SomeClass()
会计算得到一个引用;字段和方法访问使用引用。这就是“对象不是值”的含义。你不能“传递”一个对象。 - newacct