규칙 3. private 생성자나 enum 자료형은 싱글턴 패턴 따르도록 설계하라
싱글턴
- 객체를 하나만 만들 수 있는 클래스
방법 1. static 멤버변수로 선언(생성자를 private으로)
public class Elvis{
public static final Elvis INSTANCE = new Elvis();
private Elvis(){...}
}
- 클래스가 싱글턴인지 선언만 보면 금방 알 수 있어 좋음.
- public static final 선언하였으므로 같은 객체 참조.
- JVM의 경우, 정적팩토리 메서드 호출을 inline으로 처리하므로 정적 팩터리 메서드 방법을 사용하는게 좋음.
방법 2. 정적 팩토리 메서드 이용(변수 선언은 private으로)
public class Elvis{
private static final Elvis INSTANCE = new ELVIS();
private Elvis(){...}
public static Elvis getInstance() {return INSTANCE;}
}
- API 를 변경하지 않고도 싱글턴 적용을 선택할 수 있음. ex) getInstance 메소드만 수정하면 스레드마다 별도의 객체를 반환하도록 할 수도 있음.
- 제네릭 타입 수용이 쉬움(규칙27)
방법 3. 직렬화 가능한 클래스로 싱글턴 구현(11장)
- implements Serializable 추가만 한다면, 역직렬화 시 새로운 객체가 생성됌.
- 모든 필드 transient 로 선언, readResolve 메소드 추가필요
private Object readResolve(){
// 동일한 객체가 반환되도록 하는 동시에, 가짜 Elvis객체는 GC 가 처리하도록 만듬.
return INSTANCE;
}
방법 4. (JDK 1.5부터) Enum 자료형 정의
public enum Elvis{
INSTANCE;
...
}
'공부 > JAVA' 카테고리의 다른 글
이펙티브 자바 2장 규칙 5. 불필요한 객체는 만들지 말라 (0) | 2021.02.17 |
---|---|
이펙티브자바 2장 규칙4. 객체생성을 막을 때는 private 생성자를 사용하라 (0) | 2021.02.17 |
이펙티브 자바 2장 규칙2.생성자 인자가 많을 경우, Builder 패턴을 적용하라 (0) | 2021.02.02 |
이펙티브 자바 2장 규칙1. 생성자 대신 정적 팩터리 메서드를 사용하라 (0) | 2021.02.02 |
[Spring] Interceptor (0) | 2020.08.08 |
댓글