假设我正在foo(int i)
用 Java 编写一个方法。
由于i
是按值传递的,因此可以安全地将其更改为foo
. 例如
无效富(int i){ 我 = 我 + 1; // 改变我 ... }
在 Java 中更改方法的参数被认为是好的还是坏的做法?
假设我正在foo(int i)
用 Java 编写一个方法。
由于i
是按值传递的,因此可以安全地将其更改为foo
. 例如
无效富(int i){ 我 = 我 + 1; // 改变我 ... }
在 Java 中更改方法的参数被认为是好的还是坏的做法?
一般来说,这被认为是不好的做法,尽管有些人会忽略它,正如您在其他答案中看到的那样。
对于像原语这样直接按值传入的参数,覆盖原始变量没有任何好处。在这种情况下,您应该按照@João 的建议进行复制。
对于通过值(对象)传递引用的参数,如果您修改句柄以指向不同的对象,那将是非常混乱的。这更重要,因为修改作为参数传递的对象的内容也会修改原始对象。
如果替换句柄引用的对象,然后修改其内容,调用者中原始引用所引用的对象将不会被替换,但阅读代码的人可能会期望它会被替换。
然而,如果您不替换对象并修改内容,则调用您的方法的方法可能不会期望此更改。此类别通常属于与安全相关的不良做法。
这只是个人意见,但我认为这可能会让其他人感到困惑,因为他们可能希望稍后在该代码中使用原始参数值,并且可能没有注意到它已经被更改。
另外,简单地创建另一个变量并为其分配修改后的值(即int j = i + 1
)是很便宜的。
由于 i 是按值传递的,因此更改它是安全的
foo()
即使传递对象引用也是绝对安全的,因为它们是本地的:即,为本地引用分配新引用不会对调用代码中的原始引用产生任何影响
这是你个人的选择。但是,我不会更改参数值,因为可能会丢失传递给此方法的实际值的跟踪。
需要注意的是,它i = i + 1;
并没有真正改变 i。它只会更改您的本地副本i
(换句话说,i
调用代码中的 不会更改)。
基于此,通过遵守POLS(最小惊喜原则) ,这是一个可读性和避免代码中意外行为的问题。
中性的。但许多人认为将方法更改为:
void foo(final int i) {
int j = i + 1; // not change i
...
}
随意工作。
取决于上下文。我倾向于“不良做法”,原因有两个:
当它是参考值时,会弹出第三个问题。如果您修改参数引用以指向其他对象并更改其状态,则原始参数不会被修改——这可能是也可能不是预期的。如果您创建对参数的另一个引用并更改新引用的状态,则参数的引用将被更改——这也可能是也可能不是预期的。