이펙티브 자바/2장 객체 생성과 파괴

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

말랑공룡 2023. 12. 18. 09:56

 

<싱글턴을 만드는 방식>

 

  • public static final 필드 방식의 싱글턴
public class Elvis {
  public static final Elvis INSTANCE = new Elvis();
  private Elvis(){...}

  public void leaveTheBuilding(){...}
}

 

- 장점

  1. 클래스가 싱글턴임이 API에 명백히 드러난다는 것
  2. 간결함
  • 정적 팩터리 방식의 싱글턴
public class Elvis{
  private static final Elvis INSTANCE = new Elvis();
  private Elvis() {...}
  public static Elvis getInstance() {return INSTANCE; }

  public void leaveTheBuilding() {...}
}

 

- 장점

  1. API를 바꾸지 않고도 싱글턴이 아니게 변경할 수 있다.
  2. 원한다면 정적 팩터리를 제네릭 싱글턴 팩터리로 만들 수 있다.
  3. 메서드 참조를 공급자(supplier)로 사용할 수 있다.
  • 열거 타입 방식의 싱글턴 - 바람직한 방법
public enum Elvis{
  INSTANCE;

  public void leaveTheBuilding() {...}
}

 

- 장점

  1. 아주 복잡한 직렬화 상황이나 리플렉션 공격에서도 제2의 인스턴스가 생기는 일을 완벽히 막아준다.