Registrador de Java: inicialización de bloque estático o inicialización en declaración de variable

15

Actualmente estoy usando logger en mi proyecto de la siguiente manera:

private static final Logger LOGGER;

static{
  LOGGER = logger.getLogger();
}

Recibí una revisión de código para usar el bloque estático para inicializar la variable del registrador. Me dijeron que inicializara la variable del registrador en la declaración de la declaración.

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

Estoy tratando de averiguar qué diferencia hará si no lo inicializo en el bloque estático. Quiero saber si esto es una práctica.

Inocuo
fuente
8
No hace ninguna diferencia, pero uno de ellos implica más tipeo y más líneas de código.
user253751
Ambos generarán exactamente el mismo bytecode. Cuál te gusta más es del todo una cuestión de gusto,
user207421
¿Por qué no usas Lombok?
Restablecer a Monica - M. Schröder

Respuestas:

48

A excepción de algunos casos de esquina realmente extraños que involucran la secuencia de inicializadores, las dos alternativas funcionarán exactamente igual.

Sin embargo, inicializar la instancia directamente en la declaración es más corto y más familiar, y debería preferirse solo por ese motivo.

Los bloques de inicialización estática son una construcción algo exótica y solo deben usarse cuando realmente proporcionan un valor agregado, como cuando necesita manejar excepciones.

Michael Borgwardt
fuente
77
Buen punto mencionando Excepciones como un caso raro para usar bloques estáticos.
user949300
44
Inicializar un HashMap es otro buen caso de uso.
RubberDuck
33
@RubberDuck Aunque los Map.ofmétodos de Java 9 deberían ayudar con eso.
cbojar
1
Sin Map.ofembargo, @cbojar devuelve un mapa inmutable, por lo que si realmente necesita uno HashMap, aún debe hacerlo a la antigua usanza. O algo asínew HashMap(Map.of(...))
kapex el
1
@Kapep Sí, usarlo para pasar al constructor es cómo lo haría si necesitara un mapa mutable en lugar del bloque inicializador.
cbojar