2016-04-01 5 views
0

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

У меня нет другого конструктора рядом с приведенным выше. Итак, какова реальная причина предупреждения?

+3

Ответ на вопрос: * Код блока инициализации экземпляра запускается сразу после вызова super() в конструкторе *, поэтому перед тем, как выполняется оставшийся код конструктора, инициализирующий конечное поле. И это именно то, о чем сообщает предупреждающее сообщение. –

+0

См. Также http://stackoverflow.com/questions/20593606/how-non-static-initializer-block-invoked?rq=1 (вопрос плох, но ответы в порядке) –

ответ

5

Блок кода инициализатора экземпляра выполняется до кода конструктора, поэтому ваша переменная resources не инициализируется перед использованием блоком инициализатора экземпляра.

Поскольку у вас есть только один конструктор, вы можете просто переместить код блока инициализатора экземпляра в конструктор.

+0

Меня смутило слово " копирует блоки инициализации в каждый конструктор "в документах Oracle. О, и там было более одного ctor на указанном классе. Я нахожусь в процессе рефакторинга, и это событие поразило мое любопытство. Благодарю. – ridsatrio

+0

@ ridsatrio Добро пожаловать – Eran