我见过函数参数已被声明为final的代码。令人惊讶的是没有看到构造函数参数声明为final的代码。
例如:
public class Foo {
public Foo(final int day, final int month, final int year) {
...
}
}
为什么这不常见?是否有一个具体的原因或只是代码变得冗长的事实?
答案 0 :(得分:12)
Java始终只将参数的副本传递给函数。这意味着参数最终的唯一作用是禁止在函数内部赋值。
分配给函数参数(无论是在构造函数还是任何其他函数中)都被认为是错误的样式,因为这会将参数的含义从函数参数更改为函数局部变量。因此,名称的含义就会丢失。
第二个原因是类可以使字段field1
和构造函数具有名为field1
的参数。声明参数final会避免出现field1 = field1;
这样的错误,而实际意味着this.field1 = field1;
。
本质上,在函数参数上声明final是一个品味问题,并增加了一些安全性(但是好的IDE应该警告无论如何都没有效果的赋值)。你必须为此安排更多(可能是非常少量的)安全性,这就是为什么不经常使用它。
答案 1 :(得分:2)
有时您必须声明final
:
public class Test {
final Runnable runner;
public Test(final String text) {
runner = new Runnable () {
@Override
public void run () {
System.out.println("Run: "+text);
}
};
}
}
但通常你没有和恕我直言,这只是一个不必要的分心。
答案 2 :(得分:0)
你不需要将它们定义为final,但是如果你在内部类中使用它们,则禁止传递参数而不使用final。
点击此处: