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

Bobby·2022년 5월 17일
0

이펙티브 자바

목록 보기
4/7
post-thumbnail

정적 필드와 정적 메소드만을 모아 놓은 유틸성 클래스를 만드는 경우가 있다.
예를 들면

  • java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메소드 들을 모아 놓을 수 있다.
  • java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메소드(혹은 팩토리)를 모아 놓을 수 있다.
  • final 클래스를 상속해서 하위 클래스에 메소드를 넣는 것은 불가능 하기 때문에 final 클래스와 관련한 메소드들을 모아놓을 때도 사용한다.

이러한 경우의 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것이 아니기 때문에 인스턴스화를 막아 주는 것이 좋다.

  • private 생성자를 만들어 주면 간단하게 인스턴스화를 막을 수 있다.
  • 추상 클래스로 만들어 인스턴스화를 막을 수도 있지만 상속해서 사용할 수 있으므로 private 생성자를 만들어서 사용하자.
  • 내부에서 실수로 사용하는 경우를 방지하기 위해 AssertionError를 던져 주도록 한다.
  • 또한 생성자를 호출 할 수 없으니 적절한 주석을 달아 주도록 한다.
  • 이 방법은 상속을 불가능 하게 하는 효과도 있다. 하위 클래스에서 상위 클래스의 생성자를 호출 할 수 없기 때문이다.
public class UtilityClass {

	/**
     * 기본 생성자가 만들어지는 것을 막는다(인스턴스 방지용)
     * 이 클래스는 인스턴스를 만들 수 없는 유틸리티 클래스이다.
     */
    private UtilityClass() {
    	throw new AssertionError();
    }

    public static String hello() {
        return "hello";
    }
}

이렇게 만든 유틸리티 클래스는 외부에서 사용시 정적 메소드만 사용한다.

public static void main(String[] args) {
        String hello = UtilityClass.hello();
profile
물흐르듯 개발하다 대박나기

0개의 댓글