好的,据我所知,我理解关于final变量的这些事情。
final变量。现在使用上面的内容,我不明白下面的内容是如何不工作的:
public class FinalTest implements AnotherClass {
private final Something something;
private final otherthing;
@Override
public void setStuff(Something something) {
this.something = something;
this.otherthing = new SomeClass(something);
}
public FinalTest(Something something) {
setStuff(something);
}
}在构造函数完成之前,将设置final变量。那么,为什么编译器会抱怨它呢?
发布于 2012-11-20 17:03:57
不必只从构造函数调用方法,也可以从构造函数外部调用它。在将来,即使是第二个调用也可能添加到同一个构造函数中。
即使您现在可能没有使用它,但是编译器无法确定它,所以它不允许使用它。在技术方面,不存在definite assignment。
For例如:-假设您从main实例化类:-
public static void main(String[] args) {
FinalTest obj = new FinalTest(something);
obj.setStuff(something); // There you go. This cannot be prevented.
}有关这方面的详细说明,请参见JLS -确定任务。
发布于 2012-11-20 17:03:58
因为没有人会阻止您在对象的生命周期中第二次调用setStuff(),这将是非法的。
final字段只能在保证只运行一次的代码块中分配,即构造函数和实例初始化器。(如果是static final字段,则为静态初始化。)
关于这一点的更多信息可以在JLS中找到。
发布于 2012-11-20 17:04:05
因为编译器不知道唯一调用
public void setStuff(Something something) {
this.something = something;
this.otherthing = new SomeClass(something);
}来自构造函数。
https://stackoverflow.com/questions/13478264
复制相似问题