반응형
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다.
아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라
단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들 때가 있다.
예를 들어 java.lang.Math 와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아둘 수 있다.
또, final 클래스와 관련한 메서드들을 모아놓을 때도 사용한다.
이러한 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 것은 아니기에 인스턴스화를 막아야 할 필요가 있다.
클래스를 정의할 때 생성자를 따로 명시해주지 않으면 컴파일러가 자동으로 기본 생성자를 생성한다.
이 때 자동으로 생성되는 기본 생성자는 매개변수를 받지 않는 public 생성자이기 때문에 이 생성자를 이용해서 인스턴스화가 가능하다.
이를 막기 위해서는 아래의 코드처럼 애초에 클래스를 정의할 때 private 생성자를 명시해주면 된다.
- 생성자가 존재하지만 호출할 수 없기 때문에 적절한 주석을 달아주면 좋음
- 모든 생성자는 명시적이든 묵시적이든 상위 클래스의 생성자를 호출하는데, 이를 private으로 막았기 때문에 하위 클래스가 상위 클래스의 생성자에 접근할 길이 막힘 → 상속 불가
private Class UtilityClass {
// private 생성자를 명시함으로써 컴파일러가 public 생성자를 자동으로 생성하는 것을 방지함
private UtilityClass(){
return new AssertionError(); // 클래스 내부에서 실수로 생성자를 호출하지 않도록 방지함
}
...
}
반응형
'BE > Java' 카테고리의 다른 글
[Effective Java] 아이템 6. 불필요한 객체 생성을 피하라 (0) | 2022.09.02 |
---|---|
[Effective Java] 아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2022.09.01 |
[Effective Java] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보장하라. (0) | 2022.08.31 |
[Effective Java] 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라. (0) | 2022.08.30 |
[Effective Java] 아이템 1. 생성자 대신 정적 메서드 팩토리를 고려하라 (2) | 2022.08.29 |