Регистратор 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.