Java-реєстратор: ініціалізація статичного блоку або ініціалізація в оголошенні змінної


15

Наразі я використовую реєстратор у своєму проекті наступним чином:

private static final Logger LOGGER;

static{
  LOGGER = logger.getLogger();
}

Я отримав огляд коду для використання статичного блоку для ініціалізації змінної реєстратора. Мені сказали активувати змінну реєстратора в самій заяві декларації.

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

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


8
Це не має ніякої різниці, але одна з них передбачає більше введення тексту та більше рядків коду.
користувач253751

Вони обидва будуть генерувати абсолютно однаковий байт-код. Який з них ви віддаєте перевагу - це справа смаку,
user207421

Чому ви не використовуєте Lombok?
Відновіть Моніку - М. Шредер

Відповіді:


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.