Item3까지 오게 되었습니다. 바로 시작해보겠습니다.
Effective Java에서의 Item3에서는 private 생성자나 열거타입으로 싱글턴임을 보증하라는 내용입니다.
일단 싱글턴에 대해 알아보겠습니다 .
싱글턴(singleton) 이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말합니다.
자바, 스프링을 개발해보셨다면 누구나 들어보셨을만한 내용입니다.
싱글턴객체의 예로는 Item24에 나오는 함수와 같은 무상태 객체나 설계상에 유일해야하는 시스템 컴포넌트를 예로 들 수 있다.
주의해야하는상황은 클래스를 싱글턴으로 만들게 된다면 사용하는 클라이언트를 테스트하기가 어려워진다.
싱글턴을 만드는 방식은 보통 두가지 방법이 있는다 두방식 모두 생성자는 private로 감춰두고 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 만든다.
첫번재 방법 , public static final 필드 방식의 싱글턴
public class Yundle {
public static final Yundle INSTANCE = new Yundle();
private Yundle() {}
}
두번재 방법, Item1 정적 팩터리 방식의 싱글턴
class Yundle {
private static final Yundle INSTANCE = new Yundle();
private Yundle() {}
public static Yundle getInstance() {
return INSTANCE;
}
}
이렇게 2가지 방식이 있습니다.
이 두가지 방법은 시스템에서 하나뿐임을 보장하게 해줍니다.
( Item65에 나오는 방식으로 생성자가 호출이 가능하지만 추후에 알아보도록 하겠습니다. )
public 필드 방식의 장점은 해당 클래스가 싱글턴임이 API에 명백히 들어난다는 점입니다.
이유는 간단합니다 public static필드가 final 이다? 맨처음 메모리에 올라오고 나서 변경이 불가능하니 명백히 들너난다고 볼 수 있습니다.
그다음은 바로 간결함입니다.
두번째 방법인 정적 팩터리 방식의 싱글턴의 장점은 API를 변경하지 않아도싱글턴이 아니게 변경할 수 있다는 점이다. 2번째 장점은 원하면 정적 팩터리를 제네릭 싱글턴 팩터리로 만들 수 있다는 점입니다. (자세한 이야기는 Item30 을 공부하면서 보겠습니다 )
싱글턴을 만드는 방식은 2가지라고 했으나 Enum타입을 통해서도 만들 수 있습니다.
바로 원소가 하나인 Enum 타입을 선언하는 것입니다 .
enum Elvis{
INSTANCE
}
public 필드 방식과 비슷하지만 더 간결하고 리플렉션이나 제 2의 인스턴스가 만들어지는 일을 막아준다.
대부분 상황에서는 원소가 하나뿐인 열거 타입이 싱글턴을 만드는 가장 좋은 방법입니다.
하지만 싱글턴이 Enum 외의 클래스를 상속받아서 사용해야 한다면 이 방식은 사용할 수 없습니다. ( Enum 타입이 다른 interface를 구현하도록은 가능하다.)