본문 바로가기
Java & Kotlin/Effective Java

[Effective Java 3/E] Item 3. private 생성자나 열거 타입으로 싱글턴 만들기

by kiwi_wiki 2021. 1. 6.

싱글턴 (singleton)

 인스턴스를 오직 하나만 생성할 수 있는 클래스

 

클래스를 싱글턴으로 만들 시 이를 사용하는 클라이언트를 테스트하기 어려워질 수 있음

 

싱글턴을 만드는 법

private 생성자

static 멤버가 final 필드인 방식

해당 클래스가 싱글턴임이 명백히 드러남
간결함

정적 팩터리 메서드를 public static 멤버로 제공하는 방식 

api 를 바꾸지 않고도 싱글턴이 아니게 변경할 수 있음
제네릭 싱글턴 팩터리로 만들 수 있음
메서드 참조를 공급자로 사용할 수 있음

private 생성자 방식으로 만든 싱글턴 클래스를 직렬화하려면 모든 인스턴스 필드를 일시적이라고 선언하고 readResolve 메서드를 제공하여 직렬화된 인스턴스를 역직렬화 할 때마다 새로운 인스턴스가 만들어지는 것을 예방해야 함

 

열거 타입

간결하고 추가 작업 없이 직렬화 가능함

복잡한 직렬화나 리플렉션 공격에도 새로운 인스턴스가 생성되는 것을 막아줌

싱글턴이 Enum 외의 클래스를 상속해야 한다면 이 방법은 사용할 수 없음 (열거 타입이 다른 인터페이스를 구현하도록 선언할 수 없음)

 

728x90
반응형