본문 바로가기

이펙티브 자바

private 생성자나 열거 타입으로 싱글턴임을 보증하라

싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴의 전형적인 예로는 무상태 객체, 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있다. 그런데 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다.
싱글턴을 만드는 방법은 3가지가 있다. 첫 번째 방법은 생성자를 private으로 설정을 하고 static final로 설정한 필드를 제공하는 방법이다. static을 사용함으로써 인스턴스를 생성하지 않고 사용할 수 있고 final을 사용함으로써 필드값을 다시 설정하는 것을 막을 수 있다.

public class Single {
    public static final Single INSTANCE = new Single();

    private Single() {
    }
}

두 번째 방법은 정적 팩터리 메서드를 사용하는 것이다. 이 방법은 위에 방법과 비슷한데 차이점은 필드를 private 형태를 사용하고 메서드를 public static을 사용한다는 점이다.

public class Single {
    private static final Single INSTANCE = new Single();

    private Single() {
    }

    public static Single getInstance() {
        return INSTANCE;
    }
}

세 번째 방법은 enum을 사용하는 것이다. enum클래스는 인스턴스를 생성할 수 없기 때문에 싱글톤이 유지가 된다.

public enum SSingle {
    INSTANCE
}