作者: insightcodeyk
出处: https://insightcodeyk.github.io/2018/04/19/FinalKeywordInPara/
声明: 本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0,转载请注明作者及出处。
关键字: 成员方法中的内部类 局部变量 常量的生命周期
这个问题的答案来自:
StackOverFlow Michael Borgwardt
final参数的应用场景:
若该参数在传入成员方法的内部类中被使用,若不设置为final类型,则可能发生成员方法以及该临时变量参数引用被回收而内部类没被回收,内部类访问不存在的地址.
Iterator<Integer> createIntegerIterator(final int from, final int to) {
return new Iterator<Integer>() {
int index = from;
public Integer next() {
return index++;
}
public boolean hasNext() {
return index <= to;
}
// remove method omitted
};
}
在这个例子中,传入参数from, to在匿名内部类中被使用,改类中的方法调用的时候,这两个参数若不为final,则其引用在这个createIntegerIterator方法执行完之后就会被回收.
也就是说,成员方法内部类的生命周期长于成员方法本身,因此,内部类使用的成员方法中定义的变量生命周期必须等于或长于内部类,final变量就是很好的解决方案。
需要特别注意的是,现在即便这个参数不声明为final也可以运行,原因是因为,编译器帮我做了这件事,当我们看查反编译的字节码文件时,可以发现,编译器帮我们补上了final关键字.