Item04

4. 객체 생성을 막을때 private 생성자 사용하기

static 메소드와 static 필드만을 모아놓은 클래스는 객체 관점의 사고를 저해한다고 비난을 받지만 산술 연산에 필요한 기본형이나 배열 관련 메소드를 모아놓기 좋다 이런 Utility 클래스는 인스턴스 생성이 무의미 하기 때문에 인스턴스 생성을 못하도록 설계되어 있다.
명시적으로 지정한 생성자가 없어도 컴파일러는 디폴트 생성자를 만들 기 때문에 생성 가능한 클래스로 오인될 수 있다.

Utility 클래서 작성 시 인스턴스 생성을 불가능 하게 하는 방법

private 생성자 정의
//인스턴스 생성이 불가능한 유틸리티 클래스
//코드만 봐서는 생성자를 호출할 수 없도록 일부러 그렇게 한 것인지 
//알기 어렵기 때문에 주석을 추가하는 것이 좋다
public class UtilityClass {
   //디폴트 생성자가 자동으로 생기는 것을 방지
   private UtilityClass(){
       throw new AssertionError();
   }
   
   //...
}
  • private 생성자 클래스는 서브 클래스를 만들 수 없다
    : 서브 클래스 인스턴스를 생성할 때 생성자를 호출하면 수퍼 클래스의 디폴트 생성자가 호출(super)
    : 수퍼 클래스의 생성자가 private이라 호출이 불가능해지므로 컴파일 시 에러 발생

  • 추상 클래스는 인스턴스 생성을 불가능하게 하지 않는다!
    추상(abstract) 클래스는 서브 클래스를 만들 수 있고, 서브 클래스는 인스턴스를 생성할 수 있기 때문에 추상 클래스로 만들어서 인스턴스 생성을 불가능하게 하는 것은 잘못되었음

Comments