이펙티브 자바 아이템3

한주영·2023년 9월 12일
0

이펙티브자바

목록 보기
3/33

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

싱글턴이란 인스턴스를 오직 하나만 생성할수있는 클래스를 의미한다.
싱글턴의 예로는 무상태(stateless)객체나 설계상 유일해야하는
시스템 컴포넌트를 들수있다

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

public class Elvis{
   public static final Elvis INSTANCE=new Elvis();
   
   private Elvis(){...}
   
   public void leaveTheBuilding(){...}
}

private생성자는 final 필드인 인스턴스를 초기화할때 딱 한번만호출된다.

2.정적 팩터리 방식의 싱글턴

public class Elvis {
    
    private static final  Elvis INSTANCE= new Elvis();
    
    private Elvis(){}
    
    public static Elvis getInstance(){
        return INSTANCE;
    }
    
    public void leaveTheBuildng(){
        
    }
}

1)API를 바꾸지 않고도 싱글턴이 아니게 변경할수있다는점
2) 원한다면 정적 팩터리를 제네릭 싱글턴 팩터리로 만들수있다는점
3) 정적팩터리의 메서드 참조를 공급자로 사용할수있다는점

  private Object readResolve(){

        //진짜 Elvis를 반환하고 ,가짜 Elvis는 가비지 컬렉터에 저장된다.
         return INSTANCE;
    }
}

3. 열거타입 방식의 싱글턴 - 바람직한 방법

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

public 필드방식과 비슷하지만, 더 간결하게 직렬화할수있고
복잡한 직렬화 상황이나 리플렉션 공격에도 제2의 인스턴스가 생기는 완벽한 일을 막아준다.

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

profile
백엔드개발자가 되고싶은 코린이:)

0개의 댓글