为什么我不能在实例初始化程序块中使用最终字段?

时间:2016-04-01 12:55:48

标签: java initializer

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

  

Java编译器将初始化程序块复制到每个构造函数。因此,这种方法可用于在多个构造函数之间共享代码块。

另外,来自DOJ的article关于Java中的实例初始化器(强调我的):

  

实例初始化块代码在构造函数中调用super()之后立即运行,换句话说,在所有超级构造函数运行之后

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

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]);
      }
    }
  }

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

1 个答案:

答案 0 :(得分:5)

实例初始化程序块代码在构造函数的代码之前执行,因此在实例初始化程序块使用之前,resources变量未初始化。

由于您只有一个构造函数,因此您只需将实例初始化程序块的代码移动到构造函数即可。