본문 바로가기

IT/자바

[Effective Java] Item 3 Private 생성자나 열거 타입으로 싱글턴임을 보장하라

반응형

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

 

싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다.

(= 설계상 유일해야 하는 컴포넌트)

 

싱글턴을 만드는 방법은 3가지가 있다.  

1) 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 만드는 방법 

public class NutritionFacts {
    public static final NutritionFacts INSTANCE = new NutritionFacts();
    
    private NutritionFacts(){
        
    }
}

private 생성자는 public static final 필드인 NutritionFacts.INSTATCE 를 초기화할 때 딱 한번만 호출됨으로 하나뿐임을 보장한다.

 

장점

싱글턴임이 API에 명백히 드러난다.

간결하다.

 

2) 정적 팩토리 메서드를 public static 멤버로 제공하는 방법

(2가지 모드 생성자는 private으로 숨겨야 됨)

public class NutritionFacts {
    private static final NutritionFacts INSTANCE = new NutritionFacts();

    private NutritionFacts(){

    }

    public static NutritionFacts getInstance() {return INSTANCE;}
}

NutritionFacts.getInstance는 항상 같은 객체를 참조 반환한다.

 

장점

간단하게 싱글턴이 아니게 바꿀 수 있다.

정적 팩토리를 제네릭 싱글턴 팩토리로 만들 수 있다. (해당 장점이 필요없는 경우 public을 사용하는게 좋음)

 

3) 원소가 1개인 열거 타입을 선언하는 방법

public Enum NutritionFacts {
    INSTANCE;
    
    public void leaveTheBuilding(){
        
        }
}

 

장점

엄청 간결하다.

추가 노력없이 직렬화할 수 있다.

직렬화 과정에서 인스턴스가 추가로 생성되는걸 완벽하게 막을 수 있다.

 

단점

Enum외의 클래스를 상속해야 될 경우 이 방법을 사용할 수 없다.

 

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

반응형