我看到一些像
这样的代码public void foo() {
final int x = 3;
final Object z = new Object();
.......
}
我知道x不能被修改,因为它是最终的,但还有其他原因/解释吗?比较没有使用final?或者开发人员刚刚将final添加到该变量中,因为他只是喜欢。感谢。
答案 0 :(得分:1)
1)最后一堂课不能延期
2)无法覆盖最终方法
3)最终字段,参数和局部变量一旦设置
就不能改变它们的值4)将原始字段声明为final可自动确保该字段的线程安全性
5)清楚地传达你的意图
6)允许编译器和虚拟机执行次要优化
7)清楚地标记行为更简单的项目 - 最终说,"如果您正在寻找复杂性,那么您将无法在此处找到它。"答案 1 :(得分:1)
除了不让其他人更改值(对象,基元)之外没有其他原因,但这并不妨碍他们更改类中的值(例如,final Dog dog = new Dog()
会阻止其他人更改对狗对象的引用,但不会阻止我们更改其中的变量,例如,狗的大小值)
答案 2 :(得分:1)
声明变量immutable(final)本身就是一个很好的理由。除了增加代码的清晰度之外,它还为编译器提供了一些有价值的信息,当它知道某些事情不会发生变化时,可能能够更好地优化代码。
另一个原因可能隐藏在省略号后面的示例中:如果该函数中某处有一个闭包,它引用了这个局部变量,如果它们不是最终的,它就不会编译。想象一下这样的事情:
public void foo() {
final int x = 3;
final Object z = new Object();
new Thread() {
public void run() {
for(int i = 0; i < x; i++) {
System.out.println(z);
}
}
}.start();
}
为此,必须将x和z声明为final。为什么?好吧,局部变量是在堆栈上创建的,一旦函数返回,它们就会完全消失。但是,在创建它的函数返回之后,此处定义的Thread.run()
方法内的代码可能仍在执行。因为变量是final,所以在创建闭包时JVM知道它们的值,因此它可以简单地将值复制到闭包中。如果它们不是最终的,那就不可能,因为一旦原始值被修改,副本就会变得陈旧。