Java logger: inicialização de bloco estático ou inicialização na declaração de variável

15

Atualmente, estou usando o logger no meu projeto da seguinte maneira:

private static final Logger LOGGER;

static{
  LOGGER = logger.getLogger();
}

Eu recebi uma revisão de código por usar o bloco estático para inicializar a variável de logger. Disseram-me para inicializar a variável logger na própria declaração de declaração.

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

Estou tentando descobrir qual a diferença que fará se eu não inicializá-lo no bloco estático. Eu quero saber se isso é uma prática.

Inócuo
fonte
8
Não faz nenhuma diferença, mas um deles envolve mais digitação e mais linhas de código.
precisa saber é o seguinte
Ambos irão gerar exatamente o mesmo bytecode. Qual você prefere é inteiramente uma questão de gosto,
user207421
Por que você não usa Lombok?
Restabeleça Monica - M. Schröder

Respostas:

48

Exceto por alguns casos de canto realmente bizarros envolvendo a sequência de inicializadores, as duas alternativas funcionarão exatamente da mesma maneira.

No entanto, inicializar a instância correta na declaração é mais curto e mais familiar e deve ser preferido apenas por esse motivo.

Os blocos de inicialização estática são uma construção um tanto exótica e devem ser usados ​​apenas quando realmente oferecem valor agregado, como quando você precisa lidar com exceções.

Michael Borgwardt
fonte
7
É bom mencionar exceções como um caso raro para o uso de blocos estáticos.
precisa saber é o seguinte
4
A inicialização de um HashMap é outro bom exemplo de usuário.
precisa
3
@RubberDuck Embora os Map.ofmétodos do Java 9 devam ajudar com isso.
Cbojar
1
O @cbojar Map.ofretorna um mapa imutável, portanto, se você realmente precisa de um, HashMapainda precisa fazê-lo da maneira antiga. Ou algo parecidonew HashMap(Map.of(...))
Kapex
1
@ Kapep Sim, usá-lo para passar ao construtor é como faria se precisasse de um mapa mutável em vez do bloco inicializador.
Cbojar