정적 팩터리 메서드의 5가지 장점

  1. 기능을 잘 들어낼 수 있는 메서드 이름을 가질 수 있다.
//생성자
BigInteger(int, int, Random)

//정적 팩터리 메서드
BigInteger.probablePrime()
  1. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다. 반복되는 요청에 같은 객체를 반환하는 식으로 정적 팩터리 메서드로 구현하면 인스턴스를 통제 할 수 있다. 인스턴스를 통제하면 클래스를 싱글턴으로 만들 수도 인스턴스화 불가로 만들수도 있다.
  2. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다. 반환하는 객체의 클래스를 자유롭게 선택할 수 있기 때문에 구현 클래스를 공개하지 않고도 그 객체를 반환 할 수 있다.
  3. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
  4. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다. JDBC와 같은 서비스 제공자 프레임워크의 기반이 된다. JDBC에서는 Connection이 서비스 인터페이스, DriverManager.registerDriver가 제공자 등록 API, DriverManager.getConnection이 서비스 접근 API , Driver가 서비스 제공자 인터페이스

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

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

  2. 정적 팩터리 메서드는 프로그래머가 찾기 어렵다. 따라서 알려진 규약을 따라 지어서 찾기 쉽게 한다.

    1. from :매개 변수를 하나 받아서 해당 타입의 인스턴스를 반환하는 형변환 메서드

      Date d = Date.from(instant);
      
    2. of : 여러 매개변수를 받아 적합한 타입의 인스턴스를 반환하는 집계 메서드

    Set<Rank> faceCards = EnumSet.of(JACK,QUEEN,KING);
    

    c. valueOf : from과 of의 더 자세한 버전

    BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
    

    d. instance 혹은 getInstance : 매개변수로 명시한 인스턴스를 반환하지만, 같은 인스턴스임을 보장하지는 않는다.

    StackWalker luke = StackWalker.getInstance(options);
    

    e. create 혹은 newInstance : 매번 새로운 인스턴스를 생성해 반환함을 보장한다.

    Object newArray = Array.newInstance(classObject, arrayLen);