객체 생성과 파괴 (feat. 이펙티브자바-2)
싱글턴 : 인스턴스를 오직 하나만 생성할 수 있는 클래스
-> 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기 어려워짐
<싱글턴을 만드는 방법은 두 가지가 있다>
방법1.
1. 생성자 private
2. 유일한 인스턴스에 접근할 수 있는 public static 멤버를 하나 만든다.
public class Elvis{ public static final Elvis INSTANCE = new Elvis(); private Elvis() { } } |
생성자(private Elvis)는 public static final 필드인 Elvis.INSTANCE를 초기화할 때 딱 한번 호출된다.
방법2.
1. 생성자 private
2. 유일한 인스턴스에 접근할 수 있는 public static 멤버를 하나 만든다.
public class Elvis{ private static final Elvis INSTANCE = new Elvis(); private Elvis() { } public static Elvis getInstance(){ return INSTANCE; } } |
- API를 바꾸지 않고도 싱글턴이 아니게 변경할 수 있다.
- 정적 팩터리를 제네릭 싱글턴 팩터리로 만들 수 있다.
<예외>
AccessibleObject.setAccessible을 사용해 private 생성자를 호출할 수 있다. 이러한 공격을 방어하기 위해선 생성자를 수정하여 두 번째 객체가 생성되려 할 때 예외를 던지면 해결가능하다.
'공부 > 이펙티브자바' 카테고리의 다른 글
14. Comparable을 구현할지 고려하라 (0) | 2022.03.18 |
---|---|
12. toString을 항상 재정의하라 (0) | 2022.03.18 |
5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하기 (0) | 2022.03.18 |
64. 객체는 인터페이스를 사용해 참조하라 (0) | 2022.03.17 |
1. 생성자 대신 정적 팩터리 메서드를 고려하자 (0) | 2022.03.03 |
댓글