반응형
2장 객체 생성과 파괴
아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라
싱글턴
인스턴스를 오직 하나만 생성할 수 있는 클래스
방식
public static final 필드 방식
public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } }
장점
- 싱글턴임이 API에 명백히 드러남
- 간결함
단점
- 리플렉션 API AccessibleObject.setAccessible( )을 사용해 private 생성자 호출 가능
- 직렬화 시 모든 인스턴스 필드를 transient이라 선언하고, readResolve( )를 제공해야 함 (하지 않는 경우 역직렬화 시 새로운 인스턴스 생성)
정적 팩토리 방식
public class Elvis { private static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public static Elvis getInstance() { return INSTANCE; } }
장점
- API를 바꾸지 않고 싱글턴이 아니게 변경 가능
- 정적 팩토리를 제네릭 싱글턴 팩토리로 만들 수 있다.
- 정적 팩토리의 메서드 참조를 supplier로 사용 가능
단점
- 리플렉션 API AccessibleObject.setAccessible( )을 사용해 private 생성자 호출 가능
- 직렬화 시 모든 인스턴스 필드를 transient이라 선언하고, readResolve( )를 제공해야 함 (하지 않는 경우 역직렬화 시 새로운 인스턴스 생성)
열거 타입 방식
public enum Elvis { INSTANCE; }
장점
- 직렬화 상황이나 리플렉션 공격에서도 제2의 인스턴스 생성 방지
단점
- Enum 외의 클래스 상속 시 사용 불가
TODO
- API를 바꾸지 않고 싱글턴이 아니게 변경
- 제네릭 싱글턴 팩토리
- Serializable.readResolve()
반응형
'Java > OOP' 카테고리의 다른 글
[Effective Java] 2장. 아이템6 (0) | 2022.07.18 |
---|---|
[Effective Java] 2장. 아이템5 (0) | 2022.07.17 |
[Effective Java] 2장. 아이템4 (0) | 2022.07.16 |
[Effective Java] 2장. 아이템2 (0) | 2022.07.15 |
[Effective Java] 2장. 아이템1 (0) | 2022.07.14 |