我已经看到函数参数被声明为 final 的代码。令人惊讶的是,没有看到带有声明为 final 的构造函数参数的代码。
例如:
public class Foo {
public Foo(final int day, final int month, final int year) {
...
}
}
为什么这不常见?代码变得冗长是否有具体原因或仅仅是事实?
我已经看到函数参数被声明为 final 的代码。令人惊讶的是,没有看到带有声明为 final 的构造函数参数的代码。
例如:
public class Foo {
public Foo(final int day, final int month, final int year) {
...
}
}
为什么这不常见?代码变得冗长是否有具体原因或仅仅是事实?
Java 总是只将参数的副本传递给函数。这意味着 final 对参数所做的唯一事情就是不允许在函数内部分配变量。
分配给函数参数(无论是在构造函数中还是在任何其他函数中)被认为是不好的样式,因为这会将参数的含义从函数参数更改为函数局部变量。名字的意义就这样消失了。
第二个原因是,一个类可能有字段field1
,而构造函数有一个名为 的参数field1
。声明参数 final 可以避免错误,比如field1 = field1;
当一个真正的意思是this.field1 = field1;
.
本质上,在函数参数上声明 final 是一种口味问题,并增加了一点安全性(但好的 IDE 应该警告分配无论如何都没有效果)。但是,您将不得不为(可以说是非常少量的)安全性输入更多内容,这就是它不经常使用的原因。
有时您必须声明它们final
:
public class Test {
final Runnable runner;
public Test(final String text) {
runner = new Runnable () {
@Override
public void run () {
System.out.println("Run: "+text);
}
};
}
}
但通常您不必这样做,恕我直言,这只是不必要的干扰。
您不需要将它们定义为final,但是如果您在内部类中使用它们的参数,则禁止在没有final的情况下传递参数。
在这里检查: