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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.