싱글턴은 객체를 하나만 만들 수 있는 클래스다. 싱글턴은 보통 유일할 수 밖에 없는 시스템 컴포넌트를 나타낸다. 

싱글턴 구현방법1

생성자는 private로 선언하고, 싱글턴 객체는 정적멤버를 통해 이용한다. 정적멤버는 final로 선언하여 변경불가능하도록 구현한다.

private생서자는 public static final 필드인 Elvis.INSTANCE를 초기화 할 때 한 번만 호출된다. public이나 protected로 선언된 생성자가 없으므로, Elvis 객체는 일단 Elvis클래스가 초기화되고 나면 하나만 존재하게 된다. 클라이언트가 이 상태를 변경할 방법은 없지만 주의할 것이 하나 있다. AccessibleObject.setAccessible 메서드의 도움을 받아 권한을 획득한 클라이언트는 리플렉션기능을 통해 private 생성자를 호출할 수 있다. 이런 종류의 공격을 방어하고 싶다면, 두 번째 객체를 생성하라는 요청을 받으면 예외를 던지도록 생성자를 고쳐야 한다.

싱글턴 구현방법2

정적 팩터리 메서드를 이용하는 방법이다.

 Elvis.getInstance는 항상 같은 객체에 대한 참조를 반환한다. 팩터리 메서드를 사용하는 방법의 장점은 

장점1. API를 변경하지 않고도 싱글턴 패턴을 포기할 수 있다는 것. return INSTANCE 대신 new Elvis(); 로 바꿔주면 API 변경없이 싱글턴 패턴을 포기할 수 있다.

장점2.제네릭 타입을 수용하기 쉽다

규칙1의 HashMap의 팩터리 메서드를 이용한 생성자부분을 참고하면 된다.

Enum을 이용한 실글턴 구현

 이 접근법은 기능적으로 public 필드를 사용하는 구현법과 통일하다. 한가지 차이는 좀 더 간결하는 것과, 직렬화가 자동으로 처리된다는 것.


요약

원소가 하나뿐인 enum자료형이야 말로 싱글턴을 구현하는 가장좋은 방법이다.

> 사실 무슨소린지 감이 잘 안온다..


+ Recent posts