JavaStudy

ITEM1 : 기본 생성자보다 Static 팩토리 메소드를 만들어라.

  • 클래스의 인스턴스(instance) 을 생성하도록 하는 일반적인 방법은 public 생성자(constructor)을 제공하는 것이다.
  • boolean primitive 값을 가져와서 Boolean 객체 참조로 변환하여 반환하는 Static Factory

      public static Boolean valeOf(boolean b){
          return b ? Boolean.TRUE : Boolean.FALSE;
      }
    
  • Static Factory 장점

    • 기본 생성자와는 다르게 메소드에 이름을 지어줄수 있다.
      • 생성자에 전달되는 매개변수가 반환 객체를 잘 나타내지 못하기 때문에, 이름을 잘지은 static 팩토리 메소드가 더 좋음
      • ex) BigInteger 클래스에서 소수를 생성하는 probablePrime Static 팩토리 메소드
    • 매번 새로운 오브젝트를 생성하지 않아도 된다.
      • imutable 불변 클래스의 경우 이미 생성된 인스턴스를 다시 사용할수 있다.
      • ex) 싱글톤 팩토리 함수, ( 같은 클래스 생성으로 인해 equals 를 매번 오버라이딩 해주지 않고 그냥 == 로 비교가능함 )
      • ex) Boolean.valueOf(boolean) 함수는 매번 새로운 인스턴스를 생성하지 않는다. ( new Boolean(true) 로 한다면 매번 새로운 객체를 생성할 것이다. )
    • 자신이 반환하는 타입의 어떤 서브 타입 객체도 리턴 가능함
      • ex) Interface-Based framework, Java Collection Framework interface - EnumSet 크기가 커지면 내부적으로 EnumSet 을 상속시킨 JumboEnumSet 을 팩토리 메소드에서 생성해서 알아서 리턴해줌
      • ex) Service Provider framework 클래스가 작성되는 시점에 그 메소드로 부터 반환되는 객체의 클래스가 존재하지 않아도 된다.
    • 생성자에 변수 타입을 일일이 입력해주어야 하는 불편함을 줄여줄수 있다.

       Map<Strng, List<String>> = new HashMap<String, List<String>>();
       // 아래 처럼 사용 가능하도록!
       public static <K,V> HashMap<K, V> newInstance() {
         return new HashMap<K, V>();
       }
      
      • 생성자에 호출시에 타입 추론처리는 1.6에서는 안된다. 1.8은 되나??
  • Static Factory 단점
    • 인스턴스 생성을 위해 static 팩토리 메소드만 갖고 있으면서 public이나 protected 생성자가 없는 클래스의 경우는 서브 클래스를 가질 수 없다
    • 다른 여러 스태틱 메소드랑 구별하기 쉽지 않고 코드를 읽기도 쉽지 않음 javadoc 으로 문서화를 잘하고 함수명 convention 을 잘지키면됨
  • Static Factory Convention : 아래 함수들은 Static Fatory로 사용된다고 규약을 정한다.

    • valueOf : 파라메터와 같은 값을 리턴하는.
    • of
    • getInstance
    • newInstance
    • getType
    • newType
  • Static 팩토리 메소드를 먼저 고려해보고 무심코 public 생성자를 만드는 습관을 버려라.