반응형

2장 객체 생성과 파괴

 

아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

 

싱글턴

인스턴스를 오직 하나만 생성할 수 있는 클래스

 

방식

  1. public static final 필드 방식

    public class Elvis {
        
        public static final Elvis INSTANCE = new Elvis();
        private Elvis() { ... }
    }
    
    • 장점

      • 싱글턴임이 API에 명백히 드러남
      • 간결함
    • 단점

      • 리플렉션 API AccessibleObject.setAccessible( )을 사용해 private 생성자 호출 가능
      • 직렬화 시 모든 인스턴스 필드를 transient이라 선언하고, readResolve( )를 제공해야 함 (하지 않는 경우 역직렬화 시 새로운 인스턴스 생성)
  2. 정적 팩토리 방식

    public class Elvis {
        
        private static final Elvis INSTANCE = new Elvis();
        private Elvis() { ... }
        public static Elvis getInstance() {
            return INSTANCE;
        }
    }
    
    • 장점

      • API를 바꾸지 않고 싱글턴이 아니게 변경 가능
      • 정적 팩토리를 제네릭 싱글턴 팩토리로 만들 수 있다.
      • 정적 팩토리의 메서드 참조를 supplier로 사용 가능
    • 단점

      • 리플렉션 API AccessibleObject.setAccessible( )을 사용해 private 생성자 호출 가능
      • 직렬화 시 모든 인스턴스 필드를 transient이라 선언하고, readResolve( )를 제공해야 함 (하지 않는 경우 역직렬화 시 새로운 인스턴스 생성)
  3. 열거 타입 방식

    public enum Elvis {
        
        INSTANCE;
    }
    
    • 장점

      • 직렬화 상황이나 리플렉션 공격에서도 제2의 인스턴스 생성 방지
    • 단점

      • Enum 외의 클래스 상속 시 사용 불가

 

TODO

  • API를 바꾸지 않고 싱글턴이 아니게 변경
  • 제네릭 싱글턴 팩토리
  • Serializable.readResolve()
반응형

'Java > OOP' 카테고리의 다른 글

[Effective Java] 2장. 아이템6  (0) 2022.07.18
[Effective Java] 2장. 아이템5  (0) 2022.07.17
[Effective Java] 2장. 아이템4  (0) 2022.07.16
[Effective Java] 2장. 아이템2  (0) 2022.07.15
[Effective Java] 2장. 아이템1  (0) 2022.07.14

+ Recent posts