- 인터페이스를 구현해서 만든 싱글턴이 아니면 mock 구현으로 대체할 수 없기 때문이다.
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { }
public void leaveTheBuilding() {...}
}
- 방어법 : 생성자를 수정하여 두 번쨰 객체가 생성되려 할 때 예외를 던지게 한다.
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() {...}
}
public class GenericFactoryMethod {
public static final Set EMPTY_SET = new HashSet();
public static final <T> Set<T> emptySet() {
return (Set<T>) EMPTY_SET;
}
}
- 제네릭 싱글턴 팩토리 : 제네릭으로 타입 설정 가능한 인스턴스를 만들어두고, 반환 시에 제네릭으로 받은 타입을 이용해 타입을 결정
Elvis::getInstance
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() {...}
}
- 이렇게 하지 않으면 직렬화된 인스턴스(객체 > 바이트 스트림)를 역직렬화(바이트스트림 > 객체)할 때마다 새로운 인스턴스가 생성된다.
private Object readResolve() {
return this.INSTANCE;
}
Reference: