다른 사람들은 일반적으로 싱글 톤의 문제를 아주 잘 설명했습니다. Logger의 특정 사례에 대한 메모를 추가하고 싶습니다. 나는 정적 getInstance()
또는 getRootLogger()
방법을 통해 단일 항목으로 Logger (또는 정확하게 루트 로거)에 액세스하는 것이 일반적으로 문제가되지 않는다는 데 동의합니다 . (당신이 테스트하는 클래스에 의해 기록되는 것을보고 싶지 않다면-그러나 내 경험상 필자는 이것이 필요한 경우를 거의 기억할 수 없다. 그런 다음 다른 사람들에게는 이것이 더 시급한 문제가 될 수있다).
IMO는 일반적으로 테스트중인 클래스와 관련된 상태를 포함하지 않기 때문에 싱글 톤 로거는 걱정할 필요가 없습니다. 즉, 로거의 상태 (및 가능한 변경 사항)는 테스트 된 클래스의 상태에 전혀 영향을주지 않습니다. 따라서 단위 테스트가 더 이상 어렵지 않습니다.
대안은 생성자를 통해 (거의) 앱의 모든 단일 클래스에 로거를 삽입하는 것입니다. 대체 당신은 몇 가지 점에서 발견 할 때 것 - 인터페이스의 일관성을 위해, 문제의 클래스는 현재 아무것도 기록하지 않는 경우에도 주입해야한다 해주기 때문에,이 클래스에서 뭔가를 로그인해야합니다, 당신은 로거 필요를 DI에 대한 생성자 매개 변수를 추가하여 모든 클라이언트 코드를 깨야합니다. 저는이 두 가지 옵션을 모두 싫어하고, DI를 로깅에 사용하는 것은 구체적인 이점없이 이론적 인 규칙을 준수하기 위해 제 삶을 복잡하게 만들 것이라고 생각합니다.
따라서 내 결론은 (거의) 보편적으로 사용되지만 앱과 관련된 상태를 포함하지 않는 클래스는 안전하게 Singleton으로 구현할 수 있다는 것 입니다.