객체 생성과 파괴 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개의 댓글

관련 채용 정보