Java 로거 : 정적 블록 초기화 또는 변수 선언에서 초기화


15

현재 다음과 같은 방식으로 프로젝트에서 로거를 사용하고 있습니다.

private static final Logger LOGGER;

static{
  LOGGER = logger.getLogger();
}

로거 변수를 초기화하기 위해 정적 블록을 사용하는 코드 검토를 받았습니다. 선언문 자체에서 로거 변수를 초기화하라는 지시를 받았습니다.

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

정적 블록에서 초기화하지 않으면 어떤 차이점이 있는지 알아 내려고합니다. 이것이 연습인지 알고 싶습니다.


8
차이는 없지만 그 중 하나는 더 많은 타이핑과 더 많은 코드 줄이 필요합니다.
— user253751

둘 다 정확히 동일한 바이트 코드를 생성합니다. 당신이 선호하는 것은 전적으로 맛의 문제입니다.
— user207421

롬복을 왜 사용하지 않습니까?
— 복원 모니카

답변:


48

이니셜 라이저 시퀀스와 관련된 기괴한 코너 사례를 제외하고 두 대안은 정확히 동일하게 작동합니다.

그러나 선언에서 인스턴스를 초기화하는 것이 더 짧고 친숙하므로 그 이유만으로 선호되어야합니다.

정적 초기화 블록은 다소 이국적인 구조이므로 예외를 처리해야 할 때와 같이 실제로 부가 가치를 제공 할 때만 사용해야합니다.


7
정적 블록을 사용하는 드문 경우로 예외를 언급하는 것이 좋습니다.
— user949300

4
HashMap을 초기화하는 것도 좋은 사용 사례입니다.
— RubberDuck

3
@RubberDuck 비록 Java 9의 Map.of메소드가 도움이 될 것입니다.
— cbojar

1
@cbojar Map.of는 불변의 맵을 반환하므로 실제로 필요한 경우 HashMap여전히 이전 방식으로 수행해야합니다. 또는new HashMap(Map.of(...))
— kapex

1
@Kapep 예, 생성자에 전달하기 위해 초기화 블록 대신 변경 가능한 맵이 필요한 경우 어떻게해야합니까?
— cbojar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.