스터디/이펙티브 자바

[Effective Java] Item 3. private 생성자나 Enum타입으로 싱글턴임을 보증하라

📝 작성 : 2022.05.13  ⏱ 수정 : 
728x90

싱글턴(Singleton)?

객체의 인스턴스를 오직 1개만 생성할 수 있는 클래스를 말합니다.

싱글턴을 만드는 방법

  1. private생성자 + public static 필드를 통해 인스턴스에 접근
  2. private생성자 + 정적 펙토리 메서드
  3. 열거타입을 이용

public static 필드를 통한 싱글턴 생성

public class Printer {
    public static final Printer INSTANCE = new Printer();
    private Printer() {}
    public void print() { System.out.println("위이잉~ 프린트 완료"); }
}

 

장점
  1. 해당 클래스가 싱글턴인 것이 API에 명백하게 드러남
  2. 간결함

 

정적 펙토리 메서드를 통한 싱글턴 생성

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

    public void print() { System.out.println("위이잉~ 프린트 완료"); }
}
장점
  1. API를 바꾸지 않고 싱글턴이 아니게 변경할 수 있음
  2. 제네릭 싱글턴 팩터리로 만들 수 있음
  3. 정적 펙토리 메서드 참조를 supplier로 사용할 수 있음

 

public static 필드 방식과 정적 펙토리 메서드 방식의 단점

  1. 리플렉션 API를 통해 private 생성자를 호출할 수 있음 => 두번째 객체가 생성될 때 예외처리를 하여 해결
  2. 직렬화시 단순히 Serializable을 구현한다고 선언하는 것만으로는 부족함, 역직렬화할 때마다 새로운 인스턴스가 만들어짐

 

Enum 타입을 통한 싱글턴 생성

public enum Printer {
    INSTANCE;
    public static Printer getInstance() { return INSTANCE; }
    public void print() { System.out.println("위이잉~ 프린트 완료"); }
}
장점
  1. public static 필드 방식보다 더 간결
  2. 추가 노력 없이 직렬화 할 수 있음
  3. 리플렉션 공격도 막아줌
단점

만들려는 싱글턴이 Enum외의 클래스를 상속해야 한다면 사용할 수 없음

 

 

 

책에서 소개하는 방법 및 장,단점외에 다른 것들은 추후 포스팅 할 예정입니다.

반응형