С Oracle, guide, Initializing Поля (курсив мой):Почему я не могу использовать конечные поля в блоке инициализатора экземпляра?
В Java компилятор копирует инициализатора блоки в каждом конструкторе. Поэтому этот подход может использоваться для совместного использования блока кода между несколькими конструкторами.
Кроме того, от Министерства Юстиции article о экземпляра инициализаторах в Java (курсив мой):
Instance код инициализации блока бежит сразу после вызова супер() в конструкторе, другими словами, после все суперконструкторы запустили.
Принимая во внимание, почему мой компилятор предупреждает меня каждый раз, когда я пытаюсь использовать (назначенные) окончательные поля в блоке инициализатора экземпляра, как показано ниже?
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]);
}
}
}
У меня нет другого конструктора рядом с приведенным выше. Итак, какова реальная причина предупреждения?
Ответ на вопрос: * Код блока инициализации экземпляра запускается сразу после вызова super() в конструкторе *, поэтому перед тем, как выполняется оставшийся код конструктора, инициализирующий конечное поле. И это именно то, о чем сообщает предупреждающее сообщение. –
См. Также http://stackoverflow.com/questions/20593606/how-non-static-initializer-block-invoked?rq=1 (вопрос плох, но ответы в порядке) –