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

Является ли статическая инициализация хорошей практикой программирования?

В Java мы используем блок статической инициализации:

private static final ApiKey API_KEY;

static {
    API_KEY = new ApiKey();
}

Мне было интересно, что

  • Это хорошая практика программирования?
  • Где мы должны использовать этот шаблон?

Спасибо заранее.

4b9b3361

Ответ 1

В какой-то степени это вопрос вкуса. Для меня это прекрасно, пока:

  • Вы сохраняете поле окончательным, как вы это делали
  • Вы убедитесь, что ссылка на объект является неизменной и потокобезопасной.

Статика, как правило, затрудняет запись хороших тестов. Если вы когда-либо находите, что хотите начать изменять статическое состояние, вам, вероятно, придется снова взглянуть на дизайн.

Посмотрите на Google Guice и его очень приятный Реализация Singleton.

Конечно, если ваше приложение представляет собой 10-разрядный одноклассный эксперимент, это гораздо меньше.

Обратите внимание, что в вашем примере вы можете упростить:

private static final ApiKey API_KEY = new ApiKey();

Это не всегда возможно. Возможно, вы опустили более сложный код инициализации? В этом случае Гиз снова будет стоить того.

Ответ 2

Вы можете полностью использовать статический блок инициализатора, используя следующий код:

private static final ApiKey API_KEY = new ApiKey();

или

private static final ApiKey API_KEY = createNewApiKey();

если для создания ключа API требуется больше, чем просто вызов конструктора. Это делает код более удобочитаемым, ИМХО. Но это не имеет большого значения.

Статический инициализатор полезен, когда два статических поля зависят от одного и того же кода инициализации:

static {
    // compute some values
    A = somePartOfTheComputedValues();
    B = someOtherPartOfTheComputedValues();
}

Но даже тогда A и B могут быть реорганизованы в один объект, который будет создан одним методом.

Ответ 3

Мне нравится использовать перечисления, когда это возможно.

Вместо

class ApiKey {        
    private static final ApiKey API_KEY;

    static {
        API_KEY = new ApiKey();
    }

Я бы написал

enum ApiKey {
    INSTANCE;