본문 바로가기
공부/이펙티브자바

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

by JERO__ 2022. 3. 3.

객체 생성과 파괴 (feat. 이펙티브자바-2)

 

싱글턴  :  인스턴스를 오직 하나만 생성할 수 있는 클래스

-> 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기 어려워짐

 

<싱글턴을 만드는 방법은 두 가지가 있다>

방법1. 

1. 생성자 private

2. 유일한 인스턴스에 접근할 수 있는 public static 멤버를 하나 만든다.

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

생성자(private Elvis)는 public static final 필드인 Elvis.INSTANCE를 초기화할 때 딱 한번 호출된다.

 

방법2. 

1. 생성자 private

2. 유일한 인스턴스에 접근할 수 있는 public static 멤버를 하나 만든다.

public class Elvis{
    private static final Elvis INSTANCE = new Elvis();
    private Elvis() { }
    public static Elvis getInstance(){  return INSTANCE; }
}

- API를 바꾸지 않고도 싱글턴이 아니게 변경할 수 있다.

- 정적 팩터리를 제네릭 싱글턴 팩터리로 만들 수 있다.

 

<예외>

AccessibleObject.setAccessible을 사용해 private 생성자를 호출할 수 있다. 이러한 공격을 방어하기 위해선 생성자를 수정하여 두 번째 객체가 생성되려 할 때 예외를 던지면 해결가능하다.

 

 

댓글