[Effective Java] Item4. 인스턴스화를 막으려거든 private 생성자를 사용하라.

최강일·2024년 4월 6일
0

Effective Java

목록 보기
4/9

단순히 static 메서드와 static 필드만 담은 클래스를 만들고 싶을 때가 있다.

  • java.lang.Math 나 java.utils.Arrays 처럼, 기본 타입 값이나 배열 관련 메서드들을 모아놓을때
  • java.utils.Collections 처럼 특정 인터페이스의 구현체들에 대하여, 그것들을 생성해주는 정적 팩토리 메서드들을 모아놓을 때
  • final 클래스와 관련한 메서드들을 모아놓을때

static 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 게 아니다.
하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다.(pbulic 생성자)

추상 클래스로 만들면?

인스턴스화를 막을 수 없다.
하위 클래스들이 인스턴스화하면 그만이다.
오히려 이 방법은 상속해서 쓰라는걸로 생각할 것이다.

private 생성자

private 생성자를 사용하면 아주 쉽게 해결할 수 있다.
이 코드는 생성자가 private이니 클래스 바깥에서는 접근할 수 없다.
즉, 어떤 환경에서도 인스턴화를 막는다.

하지만 생성자가 분명 존재하는데 호출할 수는 없다는 사실이 직관적이지 않다.
때문에 적절한 주석을 달아주자.

public class UtilityClass{
	//기본 생성자가 만들어지는 것을 막는다.
    private UtilityClass(){
    	throw new AssertionError();
   }
   ...
}
profile
Search & Backend Engineer

0개의 댓글