[이펙티브 자바] 4. 인스턴스화를 막으려거든 private 생성자를 사용하라

노을·2023년 1월 11일
0

이펙티브 자바

목록 보기
4/14
post-thumbnail

정적 메서드, 정적 필드만을 담은 클래스가 간혹 존재한다.

정적 메서드만 있는 유틸리티 클래스(ex. Date)는 인스턴스를 만들어서 쓸 클래스가 아니다!

그럼 인스턴스가 만들어지는 걸 어떻게 막을 수 있을까?


인스턴스화를 막는 방법

  1. 추상클래스로 만든다 → 상속받아 인스턴스 만들고 부모타입으로 바꾸면 그만임 (별로 안좋은 방법)

    그리고 추상클래스로 만들면 누군가는 이 클래스를 상속하라는 의미로 받아들일 수 있다.

  2. 생성자를 private로 만들고 다른 사람들을 위해 주석을 꼼꼼하게 작성한다. (좋은 방법)

    참고로 내부에서도 생성자를 못쓰게 하려면

    private UtilityClass() {
        throw new AssertionError(); //Exception이 아니라 Error를 던진다.
    }

    이렇게 에러를 던지면 된다.

    그런데 생성자를 명시해주었는데 에러를 던지는 것은 뭔가 상식적으로 이상하게 느껴진다. 그러니 적절한 주석을 달아두도록 하자.

    
    // 기본 생성자가 만들어지는 것을 막는다(인스턴스화 방지용).
    private UtilityClass() {
        throw new AssertionError(); //Exception이 아니라 Error를 던진다.
    }

    책에서는 //로 주석을 달았지만 java doc에서 이 생성자 역할을 설명하기 위해 java doc을 이용한 주석 처리를 해주자!

      /**
       * 이 클래스는 인스턴스를 만들 수 없습니다.
       */
      private UtilityClass() {
          throw new AssertionError();
      }

0개의 댓글