首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对最终变量的投诉

对最终变量的投诉
EN

Stack Overflow用户
提问于 2012-11-20 17:02:06
回答 5查看 359关注 0票数 7

好的,据我所知,我理解关于final变量的这些事情。

  1. 应该只分配一次
  2. 在构造函数完成之前,应该初始化所有final变量。

现在使用上面的内容,我不明白下面的内容是如何不工作的:

代码语言:javascript
复制
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变量。那么,为什么编译器会抱怨它呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-11-20 17:03:57

不必只从构造函数调用方法,也可以从构造函数外部调用它。在将来,即使是第二个调用也可能添加到同一个构造函数中。

即使您现在可能没有使用它,但是编译器无法确定它,所以它不允许使用它。在技术方面,不存在definite assignment

For例如:-假设您从main实例化类:-

代码语言:javascript
复制
public static void main(String[] args) {
    FinalTest obj = new FinalTest(something);

    obj.setStuff(something); // There you go. This cannot be prevented. 
}

有关这方面的详细说明,请参见JLS -确定任务

票数 18
EN

Stack Overflow用户

发布于 2012-11-20 17:03:58

因为没有人会阻止您在对象的生命周期中第二次调用setStuff(),这将是非法的。

final字段只能在保证只运行一次的代码块中分配,即构造函数和实例初始化器。(如果是static final字段,则为静态初始化。)

关于这一点的更多信息可以在JLS中找到。

票数 8
EN

Stack Overflow用户

发布于 2012-11-20 17:04:05

因为编译器不知道唯一调用

代码语言:javascript
复制
public void setStuff(Something something) {
    this.something = something;
    this.otherthing = new SomeClass(something);
}

来自构造函数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13478264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档