Effective Java 3/E 2장 생성자 대신 정적 팩토리 메서드를 고려하라


  • 인스턴스를 얻는전통적 수단은 Public 생성자이다.

  • 클래스는 별도로 정적 팩터리 메서드를 제공 할 수 있다. (클래스의 인스턴스를 반환하는 단순한 정적 메서드)

  • 정적 팩터리 메서드와 팩토리 패턴은 같지 않다.

  • 정적 팩터리 메서드가 생성자보다 좋은점 5가지

    1. 이름을 가질 수 없다.

      • 어떤게 더 의미를 잘 설명할 수 있는 가?
        BigInteger(int, int, Random)
        
        BigInteger.ProbablePrime
        
      • 한 클래스에 시그니처가 같은 생성자가 여러개 필요할 것 같으면 생성자를 정적 팩터리 메서드로 바꾸고 각각의 차이를 잘 드러내는 이름을 지어 주자.
    2. 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다.

      • 덕분에 불변 클래스는 인스턴스를 미리 만들어 놓거나 새로 생성한 인스턴스를 캐싱하여 재활용하는 식으로 불필요한 객체 생성을 피할 수 있다.

      • 같은 객체가 자주 요청되는 상황이라면 성능을 상당히 끌어올려 준다.

      • 반복되는 요청이 같은 객체르 반환하는 식으로 정적 팩터리 방식의 클래스는 언제 어느 인스턴스를 살아 있게 할지를 철저히 통제할 수 있다. (이런 클래스를 인스턴즈 통제 클래스라 한다.)

      • 통제를 하면 싱글턴, 인스턴스화 불가로 만들 수 있으며 인스턴스가 단 하나뿐임을 보장할 수 있다.

    3. 반환 타입의 하위 타입 객체르 반환할 수 있는 능력이 있다.

      • 반환할 객체의 클래스를 자유롭게 선택할 수 있게 하는 엄청난 유연성을 선물한다.

      • 인터페이스를 정적 팩터리 메서드의 반환 타입으로 사용하는 인터페이스 기반 프레임워크르를 만드는 핵심 기술이기도 하다.

    4. 입력 매개변수에 따로 매번 다른 클래스의 객체를 반환할 수 있다.

      • 빤환 타입이 하위 타입이기만 하면 어떤 클래스의 객체를 반환하든 상관 없다.
    5. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.

      • 이런 유연함은 서비스 제공과 프레임워크를 만드는 근간이 된다.

      • 서비스 제공자 프레임워크는 3개의 핵심 컴포넌트로 이루어진다.

        1. 서비스 인터페이스(service interface)
        2. 제공자 등록 API(provider registration API)
        3. 서비스 접근 API(service access API)
      • 위의 3개의 컴포넌트와 쓰이는 서비스 제공자 인터페이스(service pro-vider- interface)라는 네 번째 컴포넌트가 있다.

  • 정적 팩터리 메서드의 단점 2가지

    1. 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하우ㅢ 클래스를 만들수 없다.

    2. 정적 팩터리 메서드는 프로그래머가 찾기 어렵다. 그래서 API 문서를 잘 만들어야 한다.