본문 바로가기

java

[Effective Java] private 생성자를 사용해서 인스턴스 생성을 못하게 하자

이번에 정리하고자하는 내용은 챕터 2의 4항목인 "private 생성자를 사용해서 인스턴스 생성을 못하게 하자"이다.

블로그 작성 목적은 복습과 이 책을 다 읽고자하는 다짐으로 시작한다.

 

1. 문제점

  프로젝트 진행 시 산술연산이나 배열작업 등의 유틸리티 클래스 류를 많이 만들어 사용한다.

  해당 클래스들은 static 메소드와 static 필드로 흔히 구성되어져 있으며 이 클래스들은 인스턴스를 생성하지 

  못하게 설계되어 있다. 인스턴스 생성이 무의미 하기 때문이다. 

  하지만 컴파일러는 생성자가 없는 클래스라도 디폴트(default) 생성자를 만들어준다.

  여기서 문제점은 javadoc 프로그램으로 생성하는 API 문서에 해당 생성자가 나타나므로 인스턴스가 생성 가능한 

  클래스로 오인될 수 있다.


2. 해결방법

  인스턴스를 생성할 수 없게 private 생성자를 정의하면 인스턴스 생성이 불가능한 클래스로 만들 수 있으며 

  API 문서에도 나타나지 않는다.

public class UtilityClass {
    private UtilityClass() {
        throw new AssertionError();
    }
}

결론

이렇게 하면 생성자가 private이므로 외부에서 해당 클래스 인스턴스를 생성할 수 없으며 클래스 내부에서라도 

우연히 호출했을 경우 AssertionError 예외가 발생하게 된다.

위와 같이 하더라도 주석을 통해 해당 클래스의 인스턴스 불가 내용을 작성해두는게 좋다.