Главная » Java » Статическая инициализация Java

0

Статическим полям класса позволено иметь инициализаторы (такие конструкции вы уже видели). Но язык предусматривает возможность выполнения более сложных операций в контексте блока статической инициализации. Блок статической инициализации во многом подобен обычному блоку инициализации – отличия состоят в применении модификатора statiс, возможности обращения только к статическим членам класса и запрете на генерацию объявляемых исключений. Ниже приведен пример статической инициализации небольшого массива простых чисел (простым называют натуральное число, которое делится без остатка только на единицу и само на себя. – Прим. перев.).

 

class Primes {

         static int[] knownPrimes = new int[4];

         static {

                        knownPrimes[0] = 2;

                        for (int i = 1; i < knownPrimes.length; i++)

                                        knownPrimes[i] = nextPrime(i);

         }

         //             объявление nextPrime …

}

 

Поля класса инициализируются последовательно – сначала выполняются первые по порядку выражение или блок инициализации, затем следующие и Т.д. Операции статической инициализации осуществляются при загрузке класса. В Отношении приведенного выше примера компилятор может поручиться, что массив knownPrimes будет создан еще до того, как начнут выполняться инструкции блока статической инициализации. Подобным образом обеспечиваются и гарантии того, что к моменту возможного обращения к статическому полю класса извне оно будет проинициализировано корректно

А что случится, если статический инициализатор в классе Х предусматривает обращение к методу в классе У, а статический инициализатор У пользуется методом, объявленным в Х? Подобный цикл статической инициализации нельзя Однозначно выявить на этапе компиляции, поскольку во время компиляции класса Х кода У может не быть вовсе (последний тезис вызывает возражения класс Х в такой ситуации просто не будет откомпилирован; авторы, вероятно?

 

имели в виду, что компилированная версия класса У не удовлетворяет требованиям класса Х. – Прим. перев.). Если цикл имеет место, статический инициализатор класса Х будет выполнен только до точки вызова метода, принадлежащего классу У. Когда, в свою очередь, код класса У обращается к методу из Х, этот вызов провоцирует осуществление операций статической инициализации Х, все еще ожидающих выполнения. Любые статические поля Х, не получившие требуемых исходных значений, которые предусмотрены в конструкциях инициализации, по-прежнему останутся со значениями, предлагаемыми по умолчанию (например, false, ‘\u000′, 0, null и Т.Д., в зависимости от их типа).

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии