Rejestrator Java: inicjalizacja bloku statycznego lub inicjalizacja w deklaracji zmiennej

15

Obecnie używam loggera w moim projekcie w następujący sposób:

private static final Logger LOGGER;

static{
  LOGGER = logger.getLogger();
}

Otrzymałem recenzję kodu za użycie bloku statycznego do zainicjowania zmiennej rejestratora. Powiedziano mi, aby zainicjalizować zmienną rejestrującą w samej instrukcji deklaracji.

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

Próbuję dowiedzieć się, jaka to będzie różnica, jeśli nie zainicjuję tego w bloku statycznym. Chcę wiedzieć, czy to jest praktyka.

Nieszkodliwy
źródło
8
Nie robi to żadnej różnicy, ale jeden z nich wymaga więcej pisania i więcej linii kodu.
user253751
Oba wygenerują dokładnie ten sam kod bajtowy. To, który wolisz, jest całkowicie kwestią gustu,
user207421
Dlaczego nie korzystasz z Lombok?
Przywróć Monikę - M. Schröder

Odpowiedzi:

48

Z wyjątkiem niektórych naprawdę dziwnych przypadków narożnych obejmujących sekwencję inicjalizacji, dwie alternatywy będą działać dokładnie tak samo.

Jednak inicjowanie instancji bezpośrednio w deklaracji jest krótsze i bardziej znane i powinno być preferowane tylko z tego powodu.

Statyczne bloki inicjujące są dość egzotyczną konstrukcją i powinny być używane tylko wtedy, gdy faktycznie zapewniają wartość dodaną, na przykład gdy trzeba obsługiwać wyjątki.

Michael Borgwardt
źródło
7
Warto wspomnieć o wyjątkach jako rzadkim przypadku użycia bloków statycznych.
user949300,
4
Inicjalizacja HashMap to kolejny dobry przykład użycia.
RubberDuck,
3
@RubberDuck Chociaż Map.ofmetody Java 9 powinny w tym pomóc.
cbojar
1
@cbojar Map.ofzwraca jednak niezmienną mapę, więc jeśli faktycznie potrzebujesz HashMap, musisz zrobić to po staremu. Lub coś w stylunew HashMap(Map.of(...))
kapex
1
@Kapep Tak, użycie go do przekazania do konstruktora jest tym, co zrobiłbym, gdybym potrzebował mapy zmiennej zamiast bloku inicjalizującego.
cbojar