공부기록

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

JAVA

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

gracelove91 2019. 11. 26. 23:33
반응형

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

싱글턴?

  • 인스턴스를 오직 하나만 생성할 수 있는 클래스.
  • 무상태 객체나, 설계상 유일해야 하는 시스템컴포넌트 등.

    만드는 방식

  1. public static final 필드 방식의 싱글턴

    public class Singleton {
     public static final Singleton INSTANCE = new Singleton();
     private Singleton() { ... }
    }
    • private 생성자는 Singleton.INSTANCE를 초기화할 때 딱 한 번만 호출된다.
    • private 생성자이므로 인스턴스가 전체 시스템에서 하나 뿐임을 보장한다. ( 예외로는 리플렉션을 이용한 생성자 호출)
  2. 정적 팩터리 방식의 싱글턴

    public class Singleton {
     **private** static final Singleton INSTANCE = new Singleton();
     private Singleton() { ... }
     public static Singleton getInstance() { return INSTANCE; }
    }
    • Singleton.getInstance()는 항상 같은 객체의 참조를 반환하므로 또 다른 인스턴스는 만들어지지않는다.
  1. 원소가 하나인 열거타입을 선언하는 것.
    public enum Singleton {
     INSTANCE;
    }
    • 앞선 두가지 방법 모두 리플렉션을 공격에 취약한데, 이 방식은 리플렉션 공격에도 안전하다.
    • 대부분 상황에서는 이 방식이 가장 좋다. 단! 만드려는 싱글턴이 Enum외의 클래스를 상속해야한다면 이 방식은 쓸 수 없다. ( 다른 인터페이스를 구현하도록 선언은 가능 )
반응형