Enregistreur Java: initialisation de bloc statique ou initialisation dans une déclaration de variable

15

Actuellement, j'utilise l'enregistreur dans mon projet de la manière suivante:

private static final Logger LOGGER;

static{
  LOGGER = logger.getLogger();
}

J'ai reçu un examen du code pour utiliser un bloc statique pour initialiser la variable de l'enregistreur. On m'a dit d'initialiser la variable logger dans l'instruction de déclaration elle-même.

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

J'essaie de comprendre quelle différence cela fera-t-il si je ne l'initialise pas dans le bloc statique. Je veux savoir si c'est une pratique.

Inoffensif
la source
8
Cela ne fait aucune différence, mais l'un d'eux implique plus de frappe et plus de lignes de code.
user253751
Ils généreront tous les deux exactement le même bytecode. Laquelle vous préférez est entièrement une question de goût,
user207421
Pourquoi n'utilisez-vous pas Lombok?
Rétablir Monica - M. Schröder

Réponses:

48

À l'exception de certains cas d'angle vraiment bizarres impliquant la séquence d'initialiseurs, les deux alternatives fonctionneront exactement de la même manière.

Cependant, l'initialisation du droit d'instance dans la déclaration est plus courte et plus familière, et devrait être préférée pour cette seule raison.

Les blocs d'initialisation statiques sont une construction quelque peu exotique et ne doivent être utilisés que lorsqu'ils fournissent réellement une valeur ajoutée, par exemple lorsque vous devez gérer des exceptions.

Michael Borgwardt
la source
7
Bon point de mentionner les exceptions comme cas rare d'utilisation de blocs statiques.
user949300
4
L'initialisation d'un HashMap est un autre bon cas d'utilisation.
RubberDuck
3
@RubberDuck Bien que les Map.ofméthodes de Java 9 devraient aider à cela.
cbojar
1
@cbojar Map.ofrenvoie cependant une carte immuable, donc si vous en avez réellement besoin, HashMapvous devez toujours le faire à l'ancienne. Ou quelque chose commenew HashMap(Map.of(...))
kapex
1
@Kapep Oui, l'utiliser pour passer au constructeur est la façon dont je le ferais si j'avais besoin d'une carte mutable au lieu du bloc d'initialisation.
cbojar