java - 为什么我不能在实例初始化 block 中使用 Final 字段?

标签 java initializer

来自 Oracle 的 guide初始化字段(强调我的):

The Java compiler copies initializer blocks into every constructor. Therefore, this approach can be used to share a block of code between multiple constructors.

此外,来自 DOJ 的 article关于 Java 中的实例初始值设定项(重点是我的):

Instance initialization block code runs right after the call to super() in a constructor, in other words, after all super constructors have run.

考虑到这一点,为什么每次我尝试在实例初始化程序 block 中使用(分配的)final 字段时,编译器都会向我发出警告,如下所示?

final class PpTitleBook implements TitleBook {
  private final Resources resources;
  private final Log log;

  PpTitleBook(Resources resources, Log log) {
    this.resources = resources;
    this.log = log;
  }

  {
    String[] resTitles = resources.getStringArray(R.array.titles);

    if (book().getAllKeys().isEmpty()) {
      for (int i = 0; i < resTitles.length; i++) {
        newTitle(resTitles[i]);
      }
    }
  }

除了上面显示的构造函数之外,我没有其他构造函数。那么警告背后的真正原因是什么?

最佳答案

实例初始化 block 代码在构造函数代码之前执行,因此您的 resources 变量在被实例初始化 block 使用之前不会被初始化。

由于您只有一个构造函数,因此您只需将实例初始值设定项 block 的代码移至构造函数即可。

关于java - 为什么我不能在实例初始化 block 中使用 Final 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36356948/

相关文章:

C++ 数组初始值设定项。使用枚举类型

java - 类型不匹配 : cannot convert from <ObjectTypeX> to <ObjectTypeX> in Tomcat7/Java 1. 7

java - 在类 exo1.Batiment 中找不到 Main 方法,请将 main 方法定义为 :public static void main(String[] args) or a JavaFX application class

java - 隐藏/显示 JTextField

java - 游戏循环控制

swift - 如何在 swift 中重写 objective-c 方法

c# - 关于 C# 中的集合初始值设定项

java - 可以从初始化 block 调用实例方法吗?

具有重载和覆盖的 Java 方法选择

c++ - 使用来自函数的数据初始化 C++ const 成员 (MPI_comm_size/rank)