싱글턴이란 인스턴스를 오직 하나만 생성할수있는 클래스를 의미한다.
싱글턴의 예로는 무상태(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;
}
}
public enum Elvis{
INSTANCE;
public void leaveTheBuilding(){...}
}
public 필드방식과 비슷하지만, 더 간결하게 직렬화할수있고
복잡한 직렬화 상황이나 리플렉션 공격에도 제2의 인스턴스가 생기는 완벽한 일을 막아준다.
대부분 상황에서는 원소가 하나뿐인 열거타입이 싱글턴을 만드는 가장 좋은 방법이다