从Oracle的指南,Initializing Fields(强调我的):
Java编译器将初始化程序块复制到每个构造函数中.因此,该方法可用于在多个构造函数之间共享代码块.
另外,来自DOJ的关于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]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
除了上面显示的那个之外,我没有其他构造函数.那警告背后的真正原因是什么?
实例初始化程序块代码在构造函数的代码之前执行,因此您的resources变量在被实例初始化程序块使用之前不会被初始化.
由于您只有一个构造函数,因此您只需将实例初始化程序块的代码移动到构造函数即可.