Java Logger: Statische Blockinitialisierung oder Initialisierung in Variablendeklaration

15

Momentan verwende ich Logger in meinem Projekt wie folgt:

private static final Logger LOGGER;

static{
  LOGGER = logger.getLogger();
}

Ich habe eine Codeüberprüfung für die Verwendung eines statischen Blocks zum Initialisieren der Logger-Variablen erhalten. Ich wurde aufgefordert, die Protokollvariable in der Deklarationsanweisung selbst zu initialisieren.

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

Ich versuche herauszufinden, welchen Unterschied es macht, wenn ich es nicht im statischen Block initialisiere. Ich möchte wissen, ob dies eine Praxis ist.

Harmlos
quelle
8
Es macht keinen Unterschied, aber eine davon erfordert mehr Eingaben und mehr Codezeilen.
user253751
Sie erzeugen beide genau den gleichen Bytecode. Welches Sie bevorzugen, ist völlig Geschmackssache
user207421
Warum benutzt du nicht Lombok?
Setzen Sie Monica - M. Schröder

Antworten:

48

Mit Ausnahme einiger wirklich bizarrer Eckfälle, die die Sequenz der Initialisierer betreffen, funktionieren die beiden Alternativen genau gleich.

Die Initialisierung der Instanz direkt in der Deklaration ist jedoch kürzer und vertrauter und sollte allein aus diesem Grund bevorzugt werden.

Statische Initialisierungsblöcke sind ein etwas exotisches Konstrukt und sollten nur verwendet werden, wenn sie tatsächlich einen Mehrwert bieten, z. B. wenn Sie Ausnahmen behandeln müssen.

Michael Borgwardt
quelle
7
Es ist sinnvoll, Ausnahmen als seltenen Fall für die Verwendung von statischen Blöcken zu erwähnen.
user949300
4
Das Initialisieren einer HashMap ist ein weiterer guter Anwendungsfall.
RubberDuck
3
@RubberDuck Obwohl die Map.ofMethoden von Java 9 dabei helfen sollten.
cbojar
1
@cbojar Map.ofgibt jedoch eine unveränderliche Karte zurück. Wenn Sie also tatsächlich eine HashMapbenötigen, müssen Sie dies immer noch auf die alte Weise tun. Oder so etwas wienew HashMap(Map.of(...))
Kapex
1
@Kapep Ja, ich würde es verwenden, um es an den Konstruktor zu übergeben, wenn ich anstelle des Initialisierungsblocks eine veränderbare Map benötige.
Cbojar