아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라

rescogitans·2022년 4월 7일
0

이펙티브 자바

목록 보기
4/5

아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라

  • 정적 메서드와 정적 필드만을 담은 클래스
    • 예시
      • java.lang.Mathjava.util.Array: 기본 타입 값이나 배열 관련 메서드를 모아놓음
      • java.util.Collections: 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(혹은 팩터리) 모음(자바 8부터는 인터페이스에 넣을 수 있다)
      • final 클래스와 관련한 메서드를 모을 경우: final클래스를 상속해서 하위 클래스에 메서드를 넣는 건 불가능하기 때문
    • 인스턴스 없이 사용하려고 설계한 유틸리티 클래스
      • 생성자를 명시하지 않으면 public 기본 생성자가 만들어지기에, 의도치 않게 인스턴스화 가능해짐
  • 인스턴스화를 막기 위해서
    • 추상 클래스로 만드는 것으로는 부족
      • 하위 클래스를 만들어서 인스턴스화할 수 있기 때문
      • 상속해서 사용하라는 의미로 오독될 수도 있다.
    • private 생성자를 추가하여 클래스의 인스턴스화를 막아라!
public class UtilityClass() {
    // 기본 생성자가 만들어지는 것을 막는다(인스턴스화 방지용).
    private UtilityClass() {
        throw new AssertionError();
    }
    ...
}
  • AssertionError는 클래스 내부에서 생성자를 호출하는 경우를 대비
  • 호출 불가능한 생성자는 직관성이 낮기 때문에 주석을 달아주는 편이 좋음
  • 상속을 불가능하게 만든다.
    • 모든 생성자는 명시적/묵시적으로 상위 클래스의 생성자를 호출하게 된다. private 생성자는 하위 클래스가 상위 클래스 생성자에 접근할 수 없게 하기에 상속이 불가하게 만든다.

0개의 댓글