자바의 대가이자 Effective Java의 저자 조슈아 블로크는 Enum을 이용한 Singleton 객체를 생성하는 것을 추천했다.
그 이유는
근데 실제로 이 방법을 사용하는 경우가 있나?
일단 내가 주로 사용하는 스프링에서는 스프링 컨테이너에서 Bean으로 객체를 관리한다.
그래서 Singleton과는 뗄 수 없는 관계인데, 여기서도 Spring은 Enum으로 Bean을 생성하지 않는다.
자체적으로 리플렉션과 프록시를 이용하여 만든다고 한다.
일반적인 Singleton 구현 방식과 좀 다른 것 같은데… 뭐지 ??
@Service 가 붙은 객체를 스캔해서 찾아냄실제로 Bean을 생성하는 것은 내부적으로 그냥 인스턴스 생성(new)과 같은 방식임.

근데? 그것을 Singleton Registry 라는 캐시 저장소에 보관함으로써 Singleton 처럼 운영하는 것.

내가 알던 Singleton 구현 방법 등등과는 관련이 없다.
Spring은 Bean Scope를 다양하게 제공함
Singleton 외에도 prototype이나 request, session 등 여러 인스턴스를 생성해야 하는 경우
→ Enum은 못함
런타임 시점에 외부설정을 주입하기 어려움
스프링은 XML이나 Java Config로 런타임에 Bean의 속성이나 의존성을 자유롭게 변경할 수 있음.
→ Enum은 못함
생성자 주입이 안됨
Enum은 런타임 시점에 생성자가 결정되어버려서 다른 객체를 주입받기 위한 생성자 오버로딩 불가
→ Spring의 유연함에 맞지 않아!!
뭔가 가장 안전하고 좋다.. 라는 것은 알겠는데 실제로 사용한 사례를 보지 못해서 그런가..
와닿지가 않는다.
프레임워크 같은 복잡한 경우에 쓰기는 힘들 것 같고, 좀 간단한 형태의 Singleton에서 사용할 듯??