[이펙티브 자바] private 생성자로 싱글턴임을 보장할 것

Dev. 로티·2022년 1월 18일
0

자바

목록 보기
3/9
post-thumbnail

싱글턴은 시스템 내에서 인스턴스가 오직 하나라는 개념을 말한다.

전형적인 예로들면 무상태 인스턴스나 혹은 시스템상에서 유일해야하는 컴포넌트를 예로들 수 있다.
싱글턴 인스턴스를 사용함으로써 다양한 장점을 얻을 수 있지만,

생성자를 private으로 선언함으로써 상속이 불가능하고, 싱글턴 인스턴스를 사용하는 클라이언트 코드를 테스트하기가 까다로워질 수 있다.
(싱글턴 인스턴스가 인터페이스를 구현하고 해당 인터페이스에 대해 mock객체를 생성함으로써 해당 문제 해결 가능)


싱글턴 인스턴스를 생성하고 반환받는 대표적인 방법은 두가지가 있다.

1 번째 예시

public class SingleTon {
	public static final SingleTon INSTANCE = new SingleTon();
	
	private SingleTon(){
		…
	}
}

위 방법은 INSTANCE가 초기화되는 시점에 해당 객체에 단 한번만 인스턴스가 할당된다.
final 키워드로 인해 클라이언트 입장에서 해당 객체 수정이 불가능하다.

2 번째 예시

public class SingleTon {
	private static final SingleTon INSTANCE = new SingleTon();
	
	private SingleTon(){
		…
	}

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

위 방법은 정적 팩토리를 사용한 방법으로 위 코드에서 싱글턴 클래스가 반환됨을 보장하고 있으나, 상황에 따라 싱글턴을 반환하지 않게끔 프로그래밍할 수 있다는 특징을 갖고있다.

위 방법은 원한다면 제네릭 싱글턴 팩토리를 만들어 활용할 수도 있고 혹은 메소드 참조 방식(SingleTon::getInstance)으로써 사용할 수도 있다.

  • 예외적으로 java에서 제공하는 리플렉션 API를 통해 private 생성자를 호출해 인스턴스를 생성할 수 있는데 그렇게 될 경우 싱글턴 이 시스템 내에 하나임을 보장하지 못하는 케이스가 되어버린다.
  • 생성자가 두 번 호출 시 예외를 던지게끔 프로그래밍함으로써 이와 같은 케이스를 예방할 수 있다.

0개의 댓글