반응형
Item 3 Private 생성자나 열거 타입으로 싱글턴임을 보장하라
싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다.
(= 설계상 유일해야 하는 컴포넌트)
싱글턴을 만드는 방법은 3가지가 있다.
1) 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 만드는 방법
public class NutritionFacts {
public static final NutritionFacts INSTANCE = new NutritionFacts();
private NutritionFacts(){
}
}
private 생성자는 public static final 필드인 NutritionFacts.INSTATCE 를 초기화할 때 딱 한번만 호출됨으로 하나뿐임을 보장한다.
장점
싱글턴임이 API에 명백히 드러난다.
간결하다.
2) 정적 팩토리 메서드를 public static 멤버로 제공하는 방법
(2가지 모드 생성자는 private으로 숨겨야 됨)
public class NutritionFacts {
private static final NutritionFacts INSTANCE = new NutritionFacts();
private NutritionFacts(){
}
public static NutritionFacts getInstance() {return INSTANCE;}
}
NutritionFacts.getInstance는 항상 같은 객체를 참조 반환한다.
장점
간단하게 싱글턴이 아니게 바꿀 수 있다.
정적 팩토리를 제네릭 싱글턴 팩토리로 만들 수 있다. (해당 장점이 필요없는 경우 public을 사용하는게 좋음)
3) 원소가 1개인 열거 타입을 선언하는 방법
public Enum NutritionFacts {
INSTANCE;
public void leaveTheBuilding(){
}
}
장점
엄청 간결하다.
추가 노력없이 직렬화할 수 있다.
직렬화 과정에서 인스턴스가 추가로 생성되는걸 완벽하게 막을 수 있다.
단점
Enum외의 클래스를 상속해야 될 경우 이 방법을 사용할 수 없다.
대부분 상황에서는 원소가 하나뿐인 열거 타입이 싱글턴을 만드는 가장 좋은 방법이다.
반응형
'IT > 자바' 카테고리의 다른 글
[Effective Java] Item 5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2021.07.11 |
---|---|
[Effective Java] Item 4 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2021.07.11 |
[Effective Java] Item 2 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2021.07.11 |
[Effective Java] Item 1 생성자 대신 정적 팩토리 메서드를 고려하라 (0) | 2021.07.11 |
Chapter 8 컬렉션 API 개선 (0) | 2020.10.04 |