В Java, почему есть блок кода без ключевых слов, только фигурные скобки - PullRequest
20 голосов
/ 14 декабря 2010

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

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

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

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

Ответы [ 4 ]

33 голосов
/ 14 декабря 2010

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

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

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

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

18 голосов
/ 14 декабря 2010

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

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

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

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

4 голосов
/ 14 декабря 2010

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

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

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

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

0 голосов
/ 14 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...