[이펙티브자바] 2-1. 생성자 대신 정적 팩터리 메서드를 고려하라

한지연·2023년 2월 16일
0

📘 생성자 대신 정적 팩터리 메서드를 고려하라

public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}

정적팩터리메서드의 장점

  • 이름을 가질 수 있음
    : 정적 팩터리는 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있음
    : 한 클래스에 시그니처가 같은 생성자가 여러 개 필요할 경우, 생성자를 정적 팩터리 메서드로 바꾸고 각각의 차이를 잘 드러내는 이름을 지어주는 것이 좋음

  • 호출될 때마다 인스턴스를 새로 생성하지 않아도 됨
    :불필요한 객체 생성을 피할 수 있음

  • 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있음
    : 유연성이 높아짐

  • 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있음

  • 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 됨

정적팩터리메서드의 단점

  • 상속 시 public protected 생성자가 필요하기 때문에 정적 팩터리 메서드만 제공할 경우 하위클래스를 만들 수 없음

  • 프로그래머가 찾기 힘듦


정적 팩터리 메서드에 사용되는 명명 방식

  • from: 매개변수 하나를 받아서 해당 타입의 인스턴스를 반환
  • of: 여러 매개변수를 받아 적합한 타입의 인스턴스 반환
  • valueOf: from과 of의 더 자세한 버전
  • getInstance: 매개변수로 명시한 인스턴스 반환
  • newInstance: 호출마다 새로운 인스턴스 반환 보장
  • getType: 생성할 클래스가 아닌 다른 클래스에서 팩터리 메서드를 정의할 때 사용, getInstance와 같음
  • newType: 생성할 클래스가 아닌 다른 클래스에 팩터리 메서드를 정의할 때 사용, newInstance와 같음
  • type: getType, newType의 간결한 버전

정적팩터리 메서드 public 생성자로 바꿔보기

  • interface
public interface MakeBoolean { // interface말고 abstract class로 만들기
    public Boolean valueOf(boolean b);
}
  • ConcreteMakeBoolean
public class ConcreteMakeBoolean implements MakeBoolean{

    boolean b;

    public ConcreteMakeBoolean(boolean b) {
        this.b = b;
    }

    @Override
    public Boolean valueOf(boolean b) {
        return b ? Boolean.TRUE: Boolean.FALSE;
    }

}

장점

  • 하위클래스를 만들 수 있음
  • 프로그래머가 찾기 쉬움

단점

  • 객체가 자주 요청되는 상황의 경우 호출 시마다 인스턴스를 새로 생성하기 때문에 성능이 떨어질 수 있음.
  • 인스턴스 통제에 어려움이 생김

최종정리

정적 팩터리를 사용하는 게 유리한 경우가 더 많기 때문에 public 생성자를 제공하던 습관이 있다면 고치는 것이 좋다.

profile
배우고 활용하는 것을 즐기는 개발자, 한지연입니다!

0개의 댓글