Подтвердить что ты не робот

В Java, почему есть блок кода без ключевых слов, только фигурные скобки

Я перефазировал некоторый унаследованный код, но был озадачен дизайнерским решением и не мог определить правильные условия для этого Google. Мой предшественник будет использовать блоки вроде этого:

public class ChildClass extends ParentClass {
    {
        inheritedVar = "someVal";
    }

    public ChildClass(){ /* constructor exists */ }
    // rest of code
}

В чем смысл объявления блока кода без ключевого слова? Он не ведет себя как статический блок, я не верю. Это альтернатива установке в конструкторе? Будет ли это иметь какой-то эффект, если использовался factory (что в данном случае это не так)? Я нашел связанную с этим тему в что происходит в C, но аргументация (scope и variable) не показалась релевантной Java.

Любые мысли или идеи о "почему" этого будут оценены. Это достаточно просто, чтобы переоценить это, мне просто любопытно в этот момент.

4b9b3361

Ответ 1

Это блок инициализатора. (Связано со статическим блоком инициализатора) См. Раздел Инициализация экземпляров на этой странице:

http://download.oracle.com/javase/tutorial/java/javaOO/initial.html

Это альтернатива конструктору. Вы можете использовать его при предоставлении нескольких перегруженных конструкторов в качестве способа совместного использования кода.

Лично, однако, я нахожу гораздо яснее, чтобы конструктор вызывал именованный метод инициализации, а не полагался на анонимный блок кода. Хотя, компилятор копирует блок инициализатора ко всем конструкторам за кулисами, и вы можете утверждать, что есть увеличение производительности, аналогичное встроенному объявлению метода.

Ответ 2

Он называется блок инициализатора.

Блоки инициализатора для переменных экземпляра выглядят так же, как и статические блоки инициализатора, но без статического ключевого слова:

    {
        // whatever code is needed for initialization goes here
    }

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

Ответ 3

Ваш предшественник все еще учился.

Это лучшее объяснение, которое вы, вероятно, получите. Возможно, в какой-то момент времени необходимо было разделить код таким образом. Трудно сказать. Код, безусловно, должен быть написан следующим образом:

public class ChildClass extends ParentClass {
    public ChildClass() {
        inheritedVar = "someVal";
    }
    // rest of code
}

Что касается блока инициализатора, его назначение было дано другими ответами здесь. Я бросил свой ответ в попытке ответить на вопрос "почему", который вы запросили. К сожалению, для реального ответа вам нужно будет спросить своего предшественника.

Ответ 4

Scope. Любые переменные, объявленные в блоке, выходят за пределы области после блока. Полезно поддерживать минимальные значения переменных.

Кроме того, если вы определяете анонимный внутренний класс, вы используете этот синтаксис для конструктора.