В Java, почему есть блок кода без ключевых слов, только фигурные скобки
Я перефазировал некоторый унаследованный код, но был озадачен дизайнерским решением и не мог определить правильные условия для этого Google. Мой предшественник будет использовать блоки вроде этого:
public class ChildClass extends ParentClass {
{
inheritedVar = "someVal";
}
public ChildClass(){ /* constructor exists */ }
// rest of code
}
В чем смысл объявления блока кода без ключевого слова? Он не ведет себя как статический блок, я не верю. Это альтернатива установке в конструкторе? Будет ли это иметь какой-то эффект, если использовался factory (что в данном случае это не так)? Я нашел связанную с этим тему в что происходит в C, но аргументация (scope и variable) не показалась релевантной Java.
Любые мысли или идеи о "почему" этого будут оценены. Это достаточно просто, чтобы переоценить это, мне просто любопытно в этот момент.
Ответы
Ответ 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. Любые переменные, объявленные в блоке, выходят за пределы области после блока. Полезно поддерживать минимальные значения переменных.
Кроме того, если вы определяете анонимный внутренний класс, вы используете этот синтаксис для конструктора.