싱글턴(Singleton)?
객체의 인스턴스를 오직 1개만 생성할 수 있는 클래스를 말합니다.
싱글턴을 만드는 방법
- private생성자 + public static 필드를 통해 인스턴스에 접근
- private생성자 + 정적 펙토리 메서드
- 열거타입을 이용
public static 필드를 통한 싱글턴 생성
public class Printer {
public static final Printer INSTANCE = new Printer();
private Printer() {}
public void print() { System.out.println("위이잉~ 프린트 완료"); }
}
장점
- 해당 클래스가 싱글턴인 것이 API에 명백하게 드러남
- 간결함
정적 펙토리 메서드를 통한 싱글턴 생성
public class Printer {
private static final Printer INSTANCE = new Printer();
private Printer() {}
public static Printer getInstance() { return INSTANCE; }
public void print() { System.out.println("위이잉~ 프린트 완료"); }
}
장점
- API를 바꾸지 않고 싱글턴이 아니게 변경할 수 있음
- 제네릭 싱글턴 팩터리로 만들 수 있음
- 정적 펙토리 메서드 참조를 supplier로 사용할 수 있음
public static 필드 방식과 정적 펙토리 메서드 방식의 단점
- 리플렉션 API를 통해 private 생성자를 호출할 수 있음 => 두번째 객체가 생성될 때 예외처리를 하여 해결
- 직렬화시 단순히 Serializable을 구현한다고 선언하는 것만으로는 부족함, 역직렬화할 때마다 새로운 인스턴스가 만들어짐
Enum 타입을 통한 싱글턴 생성
public enum Printer {
INSTANCE;
public static Printer getInstance() { return INSTANCE; }
public void print() { System.out.println("위이잉~ 프린트 완료"); }
}
장점
- public static 필드 방식보다 더 간결
- 추가 노력 없이 직렬화 할 수 있음
- 리플렉션 공격도 막아줌
단점
만들려는 싱글턴이 Enum외의 클래스를 상속해야 한다면 사용할 수 없음
책에서 소개하는 방법 및 장,단점외에 다른 것들은 추후 포스팅 할 예정입니다.
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
[Effective Java] Item 6. 불필요한 객체 생성을 피하라 (0) | 2022.05.15 |
---|---|
[Effective Java] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용 (0) | 2022.05.14 |
[Effective Java] Item 4. 인스턴스화를 막으려면 private 생성자를 사용 (0) | 2022.05.14 |
[Effective Java] Item 2. 생성자에 매개변수가 많다면 빌더 (0) | 2022.05.11 |
[Effective Java] Item 1. 생성자 대신 정적 팩토리 메서드를 고려하라 (0) | 2022.05.11 |