티스토리 뷰

(Effective Java) 규칙4. 인스턴스화를 막으려거든 private 생성자를 사용하라


유틸리티 클래스


  • 정적 메서드나 필드만 모은 클래스를 만들고 싶을 때가 있음 (악명이 높지만 분명 필요할 때가 있음)

    • 자바의 기본 자료형 값 (primitive value) 또는 배열에 적용되는 메서드를 한군데 모아둘 때 유용 (예. java.lang.Math, java.util.Arrays)

    • 특정 인터페이스를 구현하는 객체를 만드는 팩터리 메서드 등의 정적 메서드를 모아놓을 때도 유용 (예. java.util.Collections)

    • final 클래스에 적용할 메서드들을 모아놓을 때도 활용

문제


  • 이런 유틸리티(Utility) 클래스는 객체를 만들 목적의 클래스가 아님

    • 그러나 생성자를 생략하면 컴파일러는 자동으로 인자 없는 public 기본 생성자 (default constructor)를 만들어 버림
    • 일반 생성자와 구별할 수 없고, 공개 API에 포함되는 일도 드물지 않음
  • abstract로 선언해 봤자 소용이 없음

    • 하위 클래스를 만드는 순간 객체 생성이 가능해지기 때문

해결 방법


  • private 생성자를 클래스에 넣어서 객체 생성을 방지하는 것

      //객체를 만들 수 없는 유틸리티 클래스
      public class UtilityClass {
              //기본 생성자가 자동 생성되지 못하도록 하여 객체 생성 방지
              private UtilityClass() {
                      throws new AssertionError();
              }
      }
    • 클래스 외부에서는 생성자를 사용할 수 없음
    • AssertionError는 반드시 필요하진 않지만, 클래스 안에서 실수로 생성자를 호출하면 알 수 있도록 한 것
    • 이렇게 하면 하위 클래스 또한 만들 수 없다.
    • (간단하지만 매우 중요..)

끝으로

이 글이 도움이 되었다면, Google 광고 한번씩 클릭 부탁 드립니다. 🙏🙏🙏

광고 클릭은 많은 힘이 됩니다!

반응형
댓글