Java/이펙티브 자바
아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라
PHM
2022. 11. 1. 10:57
핵심정리
- 정적 메서드만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 클래스가 아니다
public class UtilityClass {
public static String hello() {
return "hello";
}
public static void main(String[] args) {
String hello = UtilityClass.hello();
// 인스턴스 불필요
UtilityClass utilityClass = new UtilityClass();
utilityClass.hello();
}
}
- 추상 클래스로 만드는 것으로 완벽히 인스턴스화를 막을 수 없다
public abstract class UtilityClass {
public UtilityClass() {
System.out.println("Constructor");
}
...
}
public class DefaultUtilityClass extends UtilityClass{
public static void main(String[] args) {
DefaultUtilityClass utilityClass = new DefaultUtilityClass();
}
}
ㆍ서브 클래스를 만들면 인스턴스를 만들 수 있게 된다. ( 자식 클래스 인스턴스를 만들때 상위 클래스 생성자를 호출 )
- private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다
public class UtilityClass {
/**
* 이 클래스는 인스턴스를 만들 수 없습니다.
*/
private UtilityClass() {
// 내부에서는 호출 가능하므로
throw new AssertionError(); // 에러 처리 ( 생성자가 사용된다면 )
}
...
}
- 생성자에 주석으로 인스턴스화 불가한 이유를 설명하는 것이 좋다
ㆍ'왜 못쓰는 코드를 만들었을까' 에 대한 해결
- 상속을 방지할 때도 같은 방법을 사용할 수 있다