IT 관련 책 정리 및 후기/Java Effective E3

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

JUN0126 2022. 5. 17. 22:58

싱글턴이란?

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

 - 설계상 유일해야 하는 시스템 컴포넌트

 - 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다

 

싱글턴 생성 방식 1

 - private 기본 생성자를 생성하여 생성자를 외부로 부터 감춘다.

 - public static final 필드를 선언하고 필드 변수가 초기화 될떄 딱 한번 호출 한다.

   EX) public static final Elvis INSTANCE = new Elvis(); 

         Elvis.INSTANCE

 - 클래스가 초기화 될 떄 만들어진 인스턴스가 전체 시스템에서 하나뿐임이 보장된다.

 

 싱글턴 생성 방식 2

 - 정적 팩터리 메서드를 public static 멤버로 제공

    EX) private static final Elvis INSTANCE = new Elvis(); // final로 선언된 필드는 다른 객체를 참조할 수 없다

          public static Elvis getInstance() { return INSTANCE; }

  - Elvis.getInstance는 항상 같은 객체의 참조를 반환하므로 제2의 Elvis인스턴스는 만들어지지 않음

  

  생성 방식 2의 장점 

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

   - 정적 팩터리를 제네릭 싱글턴 팩터리로 만들 수 있다 [ITEM 30]

 

  싱글턴 생성 방식 3

  - 원소가 하나인 열거타입을 선언

public enum Elvis {
	INSTANCE;
    
    public void methodName() {...}
}

  - 대부분의 상황에서는 원소가 하나뿐인 열거 타입이 싱글턴을 만드는 가장 좋은 방법이다.