Skip to content

Latest commit

 

History

History
20 lines (16 loc) · 1.29 KB

item4.md

File metadata and controls

20 lines (16 loc) · 1.29 KB

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

static 메서드와 static 필드를 모아둔 클래스를 만든 경우 해당 클래스를 abstract로 만들어도 상속 받아서 인스턴스를 만들 수 있다.

아무런 생성자를 만들지 않은 경우 컴파일러가 기본적으로 아무 인자가 없는 pubilc 생성자를 만들어 주기 때문에 명시적으로 private 생성자를 추가해야 한다.

// 인스턴스를 만들 수 없는 유틸리티 클래스
public class UtilityClass {
    // 기본 생성자가 만들어지는 것을 막는다. (인스턴스화 방지용)
    private UtilityClass() {
        throw new AssertionError();
    }
    ...
}
  • AssetionError를 던질 필요는 없지만, 클래스 안에서 실수로라도 생성자를 호출하지 않도록 해준다.
  • 생성자가 분명 존재하는데 호출할 수가 없다니, 그다지 직관적이지 않기 때문에 위에 코드처럼 주석을 추가하는 것이 좋다.
  • 상속을 불가능하게 하는 효과도 있다. 모든 생성자는 명시적이든 묵시적이든 상위 클래스의 생성자를 호출하게 되는데, 이를 private로 선언했으니 하위 클래스가 상위 클래스의 생성자에 접근할 길이 막힌다.