[Effective Java] 아이템 4 : 인스턴스화를 막으려거든 Private 생성자를 사용해라

2022. 3. 14. 00:13Java/Effective Java

728x90
반응형

정적 메소드와 필드만 담는 클래스

  • 곱게 보지 않지만 쓰인새는 존재하는 클래스들 -> Java.lang.Math, Java.util.Array & Collections
  • Final 크래스와 관련한 메소드를 모아 놓을때도 사용 -> 하위 클래스에 넣는건 불가

예시로 라이브러리 Array의 코드 일부를 가져왔다.

 public class Arrays
{
/**
* This class is non-instantiable.
*/
private Arrays()
{
}
  • 생성자를 명시하지 않으면 컴파일러가 생성자를 자동으로 생성
  • Public 생성자가 만들어진다. -> 사용자는 자동 생성이 되었는지 구분 불가
  • 공개 API도 의도치 않게 인스턴스 될 수도 있다.
  • 추상 클래스로 해도 상속시 무용지물이다.

Private 생성자를 추가한다면 컴파일러가 클래스의 인스턴스화 하는 것을 방어 가능하다

-> 상속이 불가한 효과를 지닌다.

public class Computer{
    private Computer(){
        throw new AssertionError();
    }
}

public class Main{
    public static void main(String[] args){
        // 인스턴스화 할 수 없다.
        Computer c = new Computer();
    }
}

class에 private 생성자를 추가 함으로써 어디서든 접근이 불가능하게 된다.

단점

  • 직관적이지 않다.
  • 만약 사용시 다른 사람을 위해 주석 처리를 하여 설명을 덧 붙여야 한다.
728x90
반응형