设置最终的类属性

Sal*_*gzi 4 java final immutability

是否可以从从该对象的构造函数调用的Private方法设置最终属性的值?

public class FinalTest {
  private final Object a;
  //Constructor
  public FinalTest() {
    setA();
  }

  private void setA() {
    a = new Object;
  }
}
Run Code Online (Sandbox Code Playgroud)

对于上面的类,编译器给出了一个错误,说我不能从方法中设置'a'的值.

据我所知,它不可能从一个构造函数之外的最后一个变量的设定值,但在上述情况下,我实际上做它在构造函数中的一种方式.那么为什么不允许这样做呢?

And*_*ite 10

这是不允许的,因为您可以setA()稍后通过其他一些非构造函数方法调用,这会违反最终保护.由于final是编译时强制操作,因此编译器通过强制初始化在构造函数或内联中​​强制执行final.

在你的简单例子中,所有看起来都很好但是如果你以后将类更新为类似下面的内容,则问题变得更加明显......

public class FinalTest {
  private final Object a;
  //Constructor
  public FinalTest() {
    setA();
  }

  private void setA() {
    a = new Object;
  }

  public void doSomething() {
   this.setA(); // not good because a is final
  }
}
Run Code Online (Sandbox Code Playgroud)