Spec-Zone .ru
спецификации, руководства, описания, API
|
Как Вы видели, можно часто обеспечивать начальное значение для поля в его объявлении:
public class BedAndBreakfast { // initialize to 10 public static int capacity = 10; // initialize to false private boolean full = false; }
Это работает хорошо, когда значение инициализации доступно, и инициализация может быть помещена в одну строку. Однако, у этой формы инициализации есть ограничения из-за ее простоты. Если инициализация требует небольшого количества логики (например, обработка ошибок или a for
цикл, чтобы заполнить сложный массив), простое присвоение является несоответствующим. Переменные экземпляра могут быть инициализированы в конструкторах, где обработка ошибок или другая логика могут использоваться. Чтобы обеспечить ту же самую возможность переменных class, язык программирования Java включает статические блоки инициализации.
Статический блок инициализации является нормальным блоком кода, включенным в фигурные скобки, { }
, и предшествовал static
ключевое слово. Вот пример:
static { // whatever code is needed for initialization goes here }
У class может быть любое число статических блоков инициализации, и они могут появиться где угодно в теле class. Системные гарантии времени выполнения, что статические блоки инициализации вызывают в порядке, что они появляются в исходном коде.
Есть альтернатива статическим блокам — можно записать частный статический метод:
class Whatever { public static varType myVar = initializeClassVariable(); private static varType initializeClassVariable() { // initialization code goes here } }
Преимущество частных статических методов состоит в том, что они могут быть снова использованы позже, если Вы должны повторно инициализировать переменную class.
Обычно, Вы поместили бы код, чтобы инициализировать переменную экземпляра в конструкторе. Есть две альтернативы использованию конструктора, чтобы инициализировать переменные экземпляра: блоки инициализатора и заключительные методы.
Инициализатор блокирует например взгляд переменных точно так же как статические блоки инициализатора, но без static
ключевое слово:
{ // whatever code is needed for initialization goes here }
Компилятор Java копирует блоки инициализатора в каждого конструктора. Поэтому, этот подход может использоваться, чтобы совместно использовать блок кода между многократными конструкторами.
Заключительный метод не может быть переопределен в подклассе. Это обсуждается в уроке в интерфейсах и наследовании. Вот пример использования заключительного метода для того, чтобы инициализировать переменную экземпляра:
class Whatever { private varType myVar = initializeInstanceVariable(); protected final varType initializeInstanceVariable() { // initialization code goes here } }
Это особенно полезно, если подклассы могли бы хотеть снова использовать метод инициализации. Метод является заключительным, потому что вызов незаключительных методов во время инициализации экземпляра может вызвать проблемы.