java - 设置最终类属性

标签 java immutability final

是否可以通过从该对象的构造函数调用的私有(private)方法为最终属性设置值?

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

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

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

我知道不可能从构造函数外部为最终变量设置值,但在上述情况下,我实际上是在构造函数中以某种方式进行的。那么为什么不允许这样做呢?

最佳答案

这是不允许的,因为您可以稍后通过一些其他非构造函数方法调用 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
  }
}

关于java - 设置最终类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5582011/

相关文章:

java - 可变对象的安全发布

java - 当外部对象用final声明时,为什么匿名内部类会调用外部对象

Java-异常处理和强制完全退出系统

java - Spring WebFlux - WebFilter 中的 statusCode 为 null

java - Android - 两个类共享首选项

java - 一次写入的数组/集合/映射内容的安全发布

python - Python 2.7 中 set 与 frozenset 占用的内存

java - 在静态 try-catch 中分配静态最终变量

java - 相对于父类(super class)构造函数的最终可变初始化

java - 如何从给定的整数值中获取字母表?