Регистратор Java: инициализация статического блока или инициализация в объявлении переменной

15

В настоящее время я использую регистратор в своем проекте следующим образом:

private static final Logger LOGGER;

static{
  LOGGER = logger.getLogger();
}

Я получил обзор кода для использования статического блока для инициализации переменной регистратора. Мне сказали инициализировать переменную logger в самом объявлении.

private static final Logger LOGGER = Logger.getLogger();

Я пытаюсь выяснить, что изменится, если я не инициализирую его в статическом блоке. Я хочу знать, если это практика.

безвредный
источник
8
Это не имеет никакого значения, но один из них включает в себя больше ввода и больше строк кода.
user253751
Они оба сгенерируют точно такой же байт-код. Какой из них вы предпочитаете - дело вкуса,
user207421
Почему вы не используете Ломбок?
Восстановить Монику - М. Шредер

Ответы:

48

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

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

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

Майкл Боргвардт
источник
7
Хорошая точка зрения, упоминающая исключения как редкий случай использования статических блоков.
user949300
4
Инициализация HashMap - еще один хороший пример использования.
RubberDuck
3
@RubberDuck Хотя Map.ofметоды Java 9 должны помочь с этим.
cbojar
1
@cbojar Map.ofвозвращает неизменную карту, поэтому, если вам действительно нужна карта, HashMapвам все равно нужно сделать это по-старому. Или что-то вродеnew HashMap(Map.of(...))
Kapex
1
@Kapep Да, используя его для передачи в конструктор, я бы сделал это, если бы мне нужна изменяемая карта вместо блока инициализатора.
cbojar