퍄퍄

[아이템1] 생성자 대신 정적 팩토리 메소드를 고려하라 본문

Java/Effective Java

[아이템1] 생성자 대신 정적 팩토리 메소드를 고려하라

오늘밤재워줭 2020. 3. 22. 17:58

책에서는 클래스가 클라이언트에 인스턴스를 제공하는 두 가지 방식을 설명한다.

  • public 생성자를 통해 제공
  • 정적 팩토리 메소드를 통한 인스턴스 반환

정적 팩토리 메소드가 사용함에 있어 유리한 경우가 더 많지만

정적 팩토리 메소드와 public 생성자는 각각의 쓰임새가 있어 public 생성자의 장점과 단점을 나열한다.

  1. 이름을 가질 수 있다.
    - 생성자를 통한 객체 반환을 사용할 경우 반환 객체의 특성을 쉽게 알기 힘들며
      한 클래스에 시그니처가 같은 생성자가 여러 개 필요할 경우, 특성을 표현하기 쉬운 네이밍으로
      여러 개의 정적 팩토리 메소드를 만들어 쓰는 것을 추천한다.
  2. 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다.
    - 불필요한 객체 생성을 피할 수 있으므로 생성 비용이 큰, 같은 객체를 자주 요청하는 상황이라면 성능면에서          효율적일 수 있다.
  3. 반환 타입의 하위 객체를 반환할 수 있는 능력이 있다.
    - 반환할 객체의 클래스를 자유롭게 선택할 수 있는 유연성을 준다.
      API를 만들 때 이 유연성을 이용하면 구현 클래스를 공개하지 않고도 해당 객체를 반환할 수 있으며
      이는 인터페이스를 정적 팩토리 메소드의 반환 타입으로 사용하는 인터페이스 기반 프레임워크를 만드는 
      핵심 기술이다.
  4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
    - 반환 타입의 하위 타입이기만 하면 어떤 클래스를 반환해도 상관 없으므로
      메소드별로 다른 클래스의 객체를 반환할 수 있다.
  5. 정적 팩토리 메소드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.

단점

  1. 상속을 하려면 public, protected 생성자가 필요하니 정적 팩토리 메소드만 제공하면 하위 클래스를 만들 수 없다.
  2. 정적 팩토리 메소드는 프로그래머가 찾기 어렵다.
    - 생성자처럼 API 설명에 명확히 드러나지 않으므로 정적 팩토리 메소드 방식의 클래스를 인스턴스할 방법을 찾아    야 한다.

 

정적 팩토리 메소드에 사용하는 명명방식

  • from : 매개변수를 하나 받아서 해당 타입의 인스턴스를 반환하는 형변환 메소드
  • of : 여러 매개변수를 받아 타입의 적합한 인스턴스를 반환하는 집계 메소드
  • valueOf : from 과 of 의 더 자세한 버전
  • instance, getInstance : (매개변수를 받는다면) 매개변수로 명시한 인스턴스를 반환하지만 같은 인스턴스를 보장하                               지는 않는다.
  • create, newInstance : instance, getInstance 와 동일하지만 매번 새로운 인스턴스를 반환한다고 보장한다.
  • getType : getInstance 와 동일하지만, 생성할 클래스가 아닌 다른 클래스에 팩토리 메소드를 정의할 때 사용한다.                 "Type"은 팩토리 메소드가 반환할 객체의 타입이다.
  • newType : newInstance 와 동일하지만, 다른 클래스에 팩토리 메소드를 정의할 때 사용한다.                                            "Type"은 팩토리 메소드가 반환할 객체의 타입이다.
  • type : getType, newType 의 간결한 버전