-
[이펙티브 자바] item 3 - private 생성자나 열거 타입으로 싱글턴임을 보증하라개발서적읽기/Effective Java 3E 2020. 6. 1. 21:51
■싱글톤 클래스 설계 시, 주의할 점 :: 테스트
클래스를 싱글톤으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려울 수 있음
싱글톤 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문
(타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글톤이 아니라면)
■싱글톤 클래스 설계 :: private 생성자
public class UserDao {
private static UserDao INSTANCE;
private UserDao(ConnectionMaker connectionMaker) {
if(INSTANCE != null){
throw new IllegalStateException();
}
this.connectionMaker = connectionMaker;
}
public static synchronized UserDao getlnstance() {
if (INSTANCE == null) INSTANCE = new UserDao(???);
return INSTANCE;
}
}public class UserDao {
public static final UserDao INSTANCE = new UserDao(???);
private UserDao(ConnectionMaker connectionMaker) {
if(INSTANCE != null){
throw new IllegalStateException();
}
this.connectionMaker = connectionMaker;
}
}(위 두가지 싱글톤 설계 방법에 대한 내용은 상단의 링크로 대체한다)
■싱글톤 클래스 설계 :: enum
원소가 하나인 열거 타입을 선언하여 싱글톤을 구현할 수도 있다.
public enum Elvis {
INSTANCE;
public void customMethod() {
}
}private 생성자 방식에서 소개한 두번째 방법과 비슷하지만, 더 간결하고
추가 노력 없이 직렬화할 수 있고, 심지어 아주 복잡한 직렬화 상황이나
리플렉션 공격에서도 제2의 인스턴스가 생기는 일을 완벽히 막아준다.
(조금 부자연스러워 보일 수는 있으나) 대부분 상황에서는 원소가 하나뿐인
열거 타입이 싱글톤을 만드는 가장 좋은 방법이다.
하지만 만들려는 싱글톤이 Enum 외의 클래스를 상속해야 한다면,
이 방법은 사용할 수 없다.
'개발서적읽기 > Effective Java 3E' 카테고리의 다른 글
[이펙티브 자바] item 6 - 불필요한 객체 생성을 피하라 (0) 2020.06.22 [이펙티브 자바] item 5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) 2020.06.22 [이펙티브 자바] item 4 - 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) 2020.06.10 [이펙티브 자바] item 2 - 생성자에 매개변수가 많다면 빌더를 고려하라 (0) 2020.05.19 [이펙티브 자바] item 1 - 생성자 대신 정적 팩터리 메서드를 고려하라 (0) 2020.05.10 댓글