인스턴스를 막으려거든 Private 생성자를 사용하라
Java에는 Arrays, Collections와 같은 유틸 클래스들이 있다.
이러한 유틸 클래스들은 대부분 정적 메서드 ( 혹은 정적 팩터리 메서드 ) 만 제공하는데, 이러한 클래스들은 인스턴스화 할 필요도 없고 인스터스 해서도 안된다.
그렇다면 이러한 클래스들은 유틸 클래스로 만들지 못하는게 가장 안전한데, 자바에서는 이를 쉽게 구현할 수 있다.
자바 특성상 클래스를 설계할때 생성자가 하나도 없다면 기본 public 생성자를 만들어 클래스를 인스턴스화 한다.
이 말은 설계시 생성자를 하나만이라도 생성하면 기본 public 생성자를 만들지 않는데,
effective java에서는 private 생성자를 만들어 클래스를 인스턴스화는걸 막으라고 설명하고있으며 실제 Arrays, Collections 같은 유틸 클래스도 이와 같은 방식을 사용하고 있다.
장점
public class MyUtil {
private MyUtil() {}
static public String getHello() { return "Hello"; }
}
public class Main {
public static void main(String[] args) {
System.out.println(MyUtil.getHello()); // Hello
MyUtil myUtil = new MyUtil(); // 'MyUtil()' has private access in 'MyUtil'
}
위처럼 실제로 private 생성자를 명시해두면 인스턴스를 만들 수 없다.
단점
이 처럼 private 생성자를 명시해두면 상속이 불가능하다.
모든 생성자는 명시적이든 묵시적이든 상위 클래스의 생성자를 호출하는데 private으로 선언 했으니 하위 클래스가 상위 클래스의 생성자에 접근할 수 가 없다.
.
'book review > Effective java' 카테고리의 다른 글
[Effective Java] Item 6. 불필요한 객체 생성을 피하라 (0) | 2024.02.06 |
---|---|
[Effective Java] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. (0) | 2024.02.05 |
[Effective Java] Item 3. 생성자나 열거 타입으로 싱글턴임을 보증하라 (1) | 2024.02.01 |
[Effective Java] Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2024.01.31 |
[Effective Java] Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2024.01.31 |