1장

아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라

클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자

정적 팩토리 메서드(Static factory method)란

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

  1. 이름을 가질 수 있다.

  2. 반드시 새로운 객체를 만들 필요가 없다

    1. 불변 클래스인 경우나 매번 새로운 객체를 만들 필요가 없는 경우에 미리 만들어둔 인스턴스 또는 캐시해둔 인스턴스를 반환 할 수 있음.
    //예시1
    public static Boolean valueOf(boolean b){
    	//미리 정의된 상수를 리턴한다. 매번 새로운 객체를 만들필요가 없다.
    	return b ? Boolean.TRUE : Boolean.FALSE;
    }
    
    //예시2
    Integer a = Integer.valueOf(100);
    Integer b = Integer.valueOf(100);
    Integer c = Integer.valueOf(200);
    
    // a와 b는 동일한 객체를 참조할 수 있음 (캐싱)
    System.out.println(a == b); // true
    System.out.println(a == c); // false
    
  3. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.

    1. java.util.Collections 는 45개에 달하는 인터페이스의 구현체의 인스턴스를 제공하지만 그 구현체들은 전부 non-public임.
      1. chatGpt
        • Collections 클래스는 List, Set, Map 등 인터페이스의 다양한 구현체를 제공하지만, 그 구현체들은 모두 비공개(non-public) 클래스.
        • 외부에서는 그 구현체의 인스턴스를 직접 생성하거나 참조할 수 없으며, Collections의 정적 메서드를 통해서만 사용할 수 있음.
        • 이는 자바의 캡슐화(encapsulation)와 설계 안정성을 위한 방식임.
    2. 인터페이스 뒤에 감춰져 있다.
  4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.

    1. 3번의 의미와 같은 것 같음
    2. 반환 타입의 하위 타입이기만 하면 어떤 클래스의 객체를 반환하든 상관없음
  5. 리턴하는 객체의 클래스가 public static 팩토리 메소드를 작성할 시점에 반드시 존재하지 않아도 된다.

참고할만한 소스

https://apieceofcoding.gitbook.io/java/modifier/static-factory-method

단점

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

    1. 이해 잘 안됨..
  2. 정적 팩터리 메서드는 프로그래머가 찾기 어렵다.

    1. API 문서를 잘 써놓고 메서드 이름도 널리 알려진 규약을 따라 짓도록해야함 P.13참고

정리