싱글톤(Singleton)
싱글톤을 만드는 두가지 방법
private
으로, 인스턴스에 접근할 수 있는 유일한 수단 = public static
멤버public static 멤버를 final 필드로 선언
public class Elvis {
**public** static **final** Elvis INSTANCE = new Elvis();
private Elvis() { ... }
}
private Elvis
생성자는 Elvis.INSTANCE
를 생성할 때(new Elvis
) 딱 한 번 호출됨
다른 클래스에서 참조할 수 없는 생성자(private) 이므로 Elvis
클래스가 가지는 인스턴스는
Elvis.INSTANCE
단 한 개 뿐임을 보장할 수 있다.
예외) 권한이 있는 클라이언트가 AccessibleObject.setAccessible
(리플렉션 API)을 사용해
private 생성자를 호출하는 경우
setAccessible
: 필드나 메서드의 접근제어 지시자에 의한 제어를 변경하는 메서드Elvis.setAccessible(true); // 이제 외부에서 private Elvis() 접근가능!
장점) 해당 클래스가 싱글톤임이 명백하게 드러나며 간결하다.
정적 팩토리 메서드를 public static 멤버로 제공
public class Elvis {
**private** static **final** Elvis INSTANCE = new Elvis();
private Elvis() { ... }
**public static Elvis getInstance() { return INSTANCE; }**
}
Elvis.getInstance
: 항상 같은 객체의 참조를 반환하므로 제2의 Elvis 인스턴스는 생성될 수 없음.정적 팩토리
→ 제네릭 싱글톤 팩토리
로 변경 가능Elvis::getInstance
를 Supplier<Elvis>
로 사용하는 식싱글톤 클래스의 직렬화
직렬화
: 자바 시스템 내부에서 사용되는 객체 또는 데이터들을 외부의 자바 시스템에서도 사용할 수 있도록
바이트(byte) 형태로 데이터 변환하는 기술역직렬화
: 바이트로 변환된 데이터를 다시 객체로 변환하는 기술 (JVM)Elvis
를 생성하는 것public class Elvis implements Serializable {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance() { return INSTANCE; }
**private Object readResolve() { return INSTANCE; }**
}