객체 생성과 파괴 item04

Bong2·2022년 3월 31일
0

이팩티브자바

목록 보기
4/9

인스턴스화를 막으려거든 private 생성자를 사용하라

static 메서드와 static 필드만을 담은 클래스를 만든 경우에 추상 클래스로 만드는 것으로도 인스턴스화를 막을 수 없다.
--> 하위 클래스를 만들어 인스턴스화하면 그만. 그래서 상속해서 쓰라는 뜻으로 오해할 수 있다는 문제가 있다.

그리고 아무런 생성자를 만들지 않으면 컴파일러가 자동으로 기본 생성자(매개변수가 없는 public 생성자)를 만들어 주기 때문에 인스턴스를 만들 수 있다.

해결방법

명시적으로 private 생성자를 만든다.

public class UtilityClass {
    // 기본 생성자가 만들어지는 것을 막는다(인스턴스화 방지용).
    private UtilityClass() {
        throw new AssertionError();
    }

    // 나머지 코드는 생략
}

꼭 AssertionError를 던질 필욘느 없지만 클래스 안에서 실수로 생성자를 호출한 경우에 에러를 발생시킬 수 있고 private생성자이기 때문에 상속도 막을 수 있다.
생성자를 제공하지만 쓸 수 없기 때문에 직관적이지 않다. 그래서 앞의 코드처럼 적절한 주석을 달아두는 것이 좋다.
상속한 경우에 명시적이든 묵시적이든 상위 클래스의 생성자를 호출해야되는데 이를 private로 호출을 막아버렸다.

profile
자바 백엔드 개발자로 성장하자

0개의 댓글