public class Elvis {
public static final Evlis INSTANCE = new Elvis();
private Elvis() {...}
public void leaveTheBuilding() {...}
}
AccessibleObject.setAccessible
을 사용해 private 생성자를 호출하는 공격이 있을 수 있다.public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() {...}
public static Elvis getInstance() {return INSTANCE;}
public void leaveTheBuilding() {...}
}
Elvis::getInstance
를 Supplier<Elvis>
로 사용하는 방식public enum Elvis {
INSTANCE;
public void leaveTheBuilding() {...}
implements Serializable
로는 부족함private Object readResolve() {
// '진짜' Elvis를 반환하고, 가짜 Elvis는 가비지 컬렉터에 맡긴다.
return INSTANCE;
}
직렬화에 관해서 가장 용이한것은 3
2의 장점: 변경 용이성 / 정적 팩터리의 메서드 참조를 공급자로 사용이 필요하지 않다면 1이 나음