오늘은 이펙티브 자바 내용 중 "인스턴스화를 막으려거든 private 생성자를 활용하라
"라는 내용에 대해 포스팅 하려고 합니다.
인스턴스화를 하지 않는 경우
- 보통 유틸리티 클래스들은 인스턴스로 만들어 쓰지 않습니다. 예를들어 Math, Pattern 클래스들이 이에 속합니다. 만약 개발자가 유틸성 클래스를 만든다면 private 생성자를 사용해서 객체 생성을 방지할 수 있습니다.
- 또한 정적 팩토리 메서드를 통한 객체 생성만을 허용할 때도 private 생성자를 적용시켜 new를 통한 객체 생성을 막을 수 있습니다.
추상 클래스도 인스턴스화를 막을 수 없다.
- 보통 추상 클래스는 인스턴스화 되지 않습니다.
- 하지만, 추상 클래스를 상속받는 하위 클래스가 인스턴스화 될 경우 super() 생성자가 자동으로 수행되기 때문에 추상 클래스 또한 인스턴스화가 될 수 있습니다.
- 따라서, 인스턴스화를 막으려면 private을 사용해야 합니다.
- 물론, 추상 클래스에 private을 사용한다면 상속이 되지 않을 것 입니다.
public abstract class Test {}
public class Test2 extends Test {
public Test2(){
super();
}
}
public abstract class Test {
private Test() {}
}
---
public class Test2 extends Test {
}
상속 또한 방지할 수 있다.
- private 생성자를 통해 상속을 방지할 수 있습니다.
- 위와 마찬가지로 super() 생성자를 호출할 수 가 없기 때문입니다.
정리
- private 생성자를 사용할 경우 왜 생성자로 인스턴스화가 불가능한지 주석으로 설명해 주는 것이 좋다고 합니다.
- 예를 들어, '정적 팩토리 메서드를 통해서만 객체를 생성할 수 있다.' 등의 설명이 필요할 것 같습니다.
reference