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

Jaeho Kim·2022년 6월 3일
0

이펙티브자바

목록 보기
2/5

기본 생성자 외에 정적 팩터리 메서드를 제공할 수 있다.

  • 팩터리 메서드 : 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드

장점1.

  • 이름을 가질 수 있다. (객체 특성 묘사 가능)

장점2.

  • 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다.
  • 만약 호출할때마다 새로운 인스턴스를 생허가게 된다면 성능이 제어될 것이다. 이러한 경우를 방지하는 것을 인스턴스 통제 클래스라고 한다.

장점3.

  • 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.
  • 생성자를 이용하지 않기때문에, 해당 클래스 내부에 있는 값에 대해서만 주고받아야 하는 제약이 사라졌다.

장점4.

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

장점5.

  • 정적팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
  • 마치 리플렉션과 같이 구조설계에 관련하여 동적인 설계가 가능해졌다. = '유연한 정적 팩터리'
  • 동적 설계라는 표현에 맞게, 의존성 주입의 개념이 이와 같다.

단점1.

  • 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩터리 메서드만 제공하면 하위 클래스를 만들 수 없다.
  • 이 제약은 상속보다 컴포지션(ITEM.18)을 사용하도록 유도하고 불변타입(ITEM.17)으로 만들라고 하는 점에서 장점으로 적용 할 수 있다.

단점2.

  • 생성자처럼 API설명에 명확히 드러나지 않으니 사용자는 정적 팩터리 메서드 방식 클래스를 인스턴스화할 방법을 알아내야한다.

정리

  • 객체 인스턴스를 할당하는 생성자를 통해서 모든처리를 해야하는가?
  • 그게 아니라면 정적팩터리메서드를 이용해보는게 어떤가?
  • 그게 왜 좋냐면 생성자의 특정에서 벗어날 수 있다구!
  • 이름도 다르게 쓰고, 항상 인스턴스를 새로 생성할 필요도 없고, 해당 클래스 외의 내용을 가변인수로 받을 수 있기 때문에 리플렉션과 같이 동적인 구조 설계가 가능해진다구!
  • 단점으로는 생성자가 아니기때문에 구조상 이해가 어려울 수 있다라는 사소한정도
profile
Hello, World!

0개의 댓글