싱글톤(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; }**
}