Является ли статическая инициализация хорошей практикой программирования? - PullRequest
12 голосов
/ 19 февраля 2012

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

private static final ApiKey API_KEY;

static {
    API_KEY = new ApiKey();
}

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

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

Заранее спасибо.

Ответы [ 3 ]

9 голосов
/ 19 февраля 2012

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

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

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

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

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

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

private static final ApiKey API_KEY = new ApiKey();

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

4 голосов
/ 19 февраля 2012

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

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 могут быть преобразованы в один объект, который будет создан одним методом.

2 голосов
/ 19 февраля 2012

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

Вместо

class ApiKey {        
    private static final ApiKey API_KEY;

    static {
        API_KEY = new ApiKey();
    }

Я бы написал

enum ApiKey {
    INSTANCE;
...