본문 바로가기

programming/java

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

싱글턴 클래스를 만드는 방법

1. public static final 필드

public class Elvis {
    public static final Elvis INSTANCE = new Elvis();
    
    public void leaveTheBuilding(){
    }
}
  • AccessibleOject.setAccessible을 사용해 private 생성자를 호출할 가능성이 존재함
  • 싱글턴임이 API에 명백히 드러난다.
  • 간결하다.

2. 정적 팩터리 방식

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

    private Elvis(){}
    public static Elvis getInstance(){ return INSTANCE; }//Supplier<Elvis>
    public void leaveTheBuilding(){
    }
}
  • AccessibleOject.setAccessible을 사용해 private 생성자를 호출할 가능성이 존재함
  • API를 바꾸지 않고도 싱글턴이 아니게 변경할 수 있다.
  • 정적 팩터리를 제네릭 싱글턴 팩터리로 만들 수 있다.
  • 정적 팩터리의 메서드 참조를 공급자(supplier)로 사용할 수 있다.

3. 열거 타입 방식

public enum Elvis {
    INSTANCE;
    public void leaveTheBuilding(){
    }
}
  • 장점
    • 간결하고, 추가 노력 없이 직렬화할 수 있다.
    • 아주 복잡한 직렬화 상황이나 리플렉션 공격에서도 제2의 인스턴스가 생기는 일을 완벽히 막아준다.
    • 대부분 상황에서는 원소가 하나뿐인 열거 타입이 싱글턴을 만드는 가장 좋은 방법이다.
  • 단점
    • 만들려는 싱글턴이 Enum 외의 클래스를 상속해야 한다면 이 방법은 사용할 수 없다.

보충 개념

 

[Java] 직렬화와 역직렬화

java-study에서 스터디를 진행하고 있습니다. 데이터 직렬화와 역직렬화 데이터 직렬화 메모리를 디스크에 저장하거나, 네트워크 통신에 사용하기 위한 형식으로 변환하는 것이다. 데이터 역직렬

steady-coding.tistory.com