정적인 필드와 메서드를 담은 클래스의 구현은 객체 지향적인 사고는 아니자만,
공통점이 있는 메서드 혹은 팩터리들을 제공할 때 사용되기도 한다.
자바 진영에서 제공하는 기본 타입, 유틸성 인터페이스 등이 있고, 이외로 final 클래스가 있다.
위 예시처럼 정적으로 선언한 만큼 인스턴스 생성하지 못하도록하는 설계 의도가 담겨 있다.
여기서 아이템 4의 제목의 의미가 나타난다.
설계 의도대로 인스턴스화를 막으려면, private 생성자를 선언하라는 것이다.
생성자를 선언하지 않으면, 기본 생성자가 컴파일 타임에 생성되기 때문이다.
Private로 선언하여도 클래스 내부에서는 접근이 가능하기에 생성자 호출 시 Assertion Error 예외를 방생시켜 실수를 방지 할 수 있다.
또한 상속 관계에서 하위타입 생성자는 상위타입 생성자를 호출하게 되어 있다. Private으로 선언함으로서 상속을 불가하게 하는 효과도 있다.
Assertion Error 예외
public class Person {
private Person() {
throw new AssertionError();
}
static void info() {
System.out.println("사람입니다.");
}
public static void main(String[] args) {
Person person = new Person(); // java.lang.AssertionError
person.info();
}
}
상속 불가
public class ExtendPerson extends Person{
public ExtendPerson() {
// 부모의 생성자가 private
super();
}
}
'Effective Java > 정리' 카테고리의 다른 글
정적 유틸리티 클래스 (Static Utility Class) (0) | 2023.01.09 |
---|---|
[Item 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2023.01.09 |
팩터리 패턴 (Factory Pattern) (0) | 2023.01.09 |
아이템6 불필요한 객체 생성을 피하라 (0) | 2023.01.08 |
아이템5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2023.01.08 |