从甲骨文的指南,初始化字段(强调地雷):
Java编译器将初始化器块复制到每个构造函数中。因此,这种方法可以用于在多个构造函数之间共享代码块。
另外,来自司法部关于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]);
}
}
}除了上面所示的构造函数之外,我没有其他构造函数。那么警告背后的真正原因是什么?
发布于 2016-04-01 12:57:11
实例初始化程序块代码在构造函数的代码之前执行,因此在实例初始化程序块使用之前不会初始化resources变量。
因为您只有一个构造函数,所以可以将实例初始化程序块的代码移到构造函数中。
https://stackoverflow.com/questions/36356948
复制相似问题