[이펙티브자바]아이템3.싱글턴

JP·2022년 7월 9일
0

자바

목록 보기
10/10

싱글턴

애플리케이션을 만들다보면 애플리케이션 내에 인스턴스가 오로지 하나만 있어야 하는 경우가 있다!

이러한 경우 싱글턴 패턴을 사용하여 인스턴스가 단 하나만을 존재하게 만들 수 있다.

패턴

  1. 생성자를 프라이빗으로 만든다.
    • 외부에서 호출할 수 없게 만든다.
    • 해당하는 클래스 내부에서만 제어할 수 있게 만드는 것이다.
  2. 본인의 타입으로 static final로 프라이빗 생성자를 통해 인스턴스를 만든다.
  3. 외부에서는 static final의 인스턴스를 호출하여 사용한다.
public class Settings {
  private Settings() {} // 1. private 생성자를 만들어 외부 접근 불가능하게
  private static final SETTINGS = new Settings(); // 2. 본인의 타입으로 static final로 프라이빗 생성자를 통해 인스턴스를 만든다.
  public static Settings getInstance(){
    return SETTINGS; //3. 외부에서 호출할 메서드를 만든다.
  }
}

단점

  1. 싱글턴을 사용하는 코드는 테스트 하기 어려워진다.
    • 인터페이스가 있는 경우 인터페이스로 대체한 후 mock객체를 생성하여 테스트 한다.
  2. 리플렉션으로 private 생성자를 호출할 수 있다.
    • 리플렉션으로 생성자를 호출하여 새로운 객체를 만드려고 할 때, 클래스 내부에 private static boolean created; 같은 필드를 만들어서 인스턴스를 만드려고 시도할 떄 익셉션을 발생시키는 등의 방어코드를 만든다
  3. 역질렬화 할 때 새로운 인스턴스가 생길 수 있다.
    • 역질렬화 할 때도 읽어올 수 있는 메서드를 만들어두면 된다.
    private Object readResolve(){
    	return INSTANCE;
    }
    Elvis elvis = (Elvis) Object.readResolve();
profile
to Infinity and b

0개의 댓글