EJ2E Item 3. 싱글톤 속성은 private 성성자 또는 enum 타입으로
Java : 2008/10/28 09:41
싱글톤은 객체를 딱 한번만 생성하는 클래스.
1.5 전에 싱글톤을 구현하는 방법은 두 개였다. 둘 다 private 생성자와 public static 멤버를 노출한다.
첫 번째 방법: public static filed
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis(){...}
...
}
private 생성자는 딱 한 번 static final 필드인 Elvis.INSTANCE를 초기화할 때만 호출한다. 한 가지 주의 할 것이 있는데...
두 번째 방법: public static factory method
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis(){...}
public static Elvis getInstance() { return INSTANCE; }
...
}
위에서 잘 모르는 부분의 문제가 이렇게 하면 발생하지 않아. (OSAF도 이런식으로 싱글톤을 만들었쥐.) 좀 더 유연하게 변경할 수 있다. Generic 타입을 고려할 수 있다.(Item 27) 이것도 모르겠군.
위의 두 가지 방법은 Serializable 하지 못한다. (static 필드는 직렬화 안 되니깐) 따라서 모든 객체 필드를 transient로 선언하거나 readResolve 메소드(Item 77)를 제공해야 한다.
세 번째 방법: Enum singleton
1.5 부터 사용할 수 있는 싱글톤 구현 방법. 캬.. 드디어 새로운 방법 등장이구나.
public enum Elvis {
INSTANCE;
...
}
이 방법은 기능적으로는 public filed 접근 방법과 동일하지만, 간결하고, 여러 객체를 생성할 여지도 없으며, 직렬화도 제공한다는 점에서 차이가 있다.
1.5 전에 싱글톤을 구현하는 방법은 두 개였다. 둘 다 private 생성자와 public static 멤버를 노출한다.
첫 번째 방법: public static filed
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis(){...}
...
}
private 생성자는 딱 한 번 static final 필드인 Elvis.INSTANCE를 초기화할 때만 호출한다. 한 가지 주의 할 것이 있는데...
a privileged client can invoke the private constructor reflectively이 부분 잘 모르겠슴.
(Item 53) with the aid of the AccessibleObject.setAccessible method
두 번째 방법: public static factory method
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis(){...}
public static Elvis getInstance() { return INSTANCE; }
...
}
위에서 잘 모르는 부분의 문제가 이렇게 하면 발생하지 않아. (OSAF도 이런식으로 싱글톤을 만들었쥐.) 좀 더 유연하게 변경할 수 있다. Generic 타입을 고려할 수 있다.(Item 27) 이것도 모르겠군.
위의 두 가지 방법은 Serializable 하지 못한다. (static 필드는 직렬화 안 되니깐) 따라서 모든 객체 필드를 transient로 선언하거나 readResolve 메소드(Item 77)를 제공해야 한다.
세 번째 방법: Enum singleton
1.5 부터 사용할 수 있는 싱글톤 구현 방법. 캬.. 드디어 새로운 방법 등장이구나.
public enum Elvis {
INSTANCE;
...
}
이 방법은 기능적으로는 public filed 접근 방법과 동일하지만, 간결하고, 여러 객체를 생성할 여지도 없으며, 직렬화도 제공한다는 점에서 차이가 있다.
a single-element enum type is the best way to implement a singleton저자가 이 정도로 권장할 정도니까.. 사용해 봐야겠다.
'Java' 카테고리의 다른 글
| EJ2E Item 8. equals를 재정의 할 떄는 일반적인 계약을 따르라. (2) | 2008/10/29 |
|---|---|
| EJ2E Item 7. finalizer 사용 자제하기 (0) | 2008/10/29 |
| EJ2E Item 6. 사용하지 않는 객체 레퍼런스를 제거하라 (0) | 2008/10/28 |
| EJ2E Item 5. 불필요한 객체 생성 방지하기 (0) | 2008/10/28 |
| EJ2E Item 4. private 생성자로 객체생성 방지하기 (0) | 2008/10/28 |
| EJ2E Item 3. 싱글톤 속성은 private 성성자 또는 enum 타입으로 (2) | 2008/10/28 |
| EJ2E Item 2. 생성자에 매개변수가 너무 많을 때는 빌더를 고려하자. (0) | 2008/10/27 |
| EJ2E Item 1. 생성자 대신 static 팩토리 메소드 사용을 고려하라. (0) | 2008/10/27 |
| Effective Java Reloaded (0) | 2008/10/26 |
| ReadWriteLock 인터페이스 (0) | 2008/09/25 |
| Generic 팩토리 메소드 (2) | 2008/09/25 |





