IT/Programming / / 2023. 4. 28. 09:23

<Effective Java> RULE 2. 생성자 인자가 많을 때는 Builder패턴 적용을 고려하라

반응형
선택적 인자가 많은 상황에서 정적팩토리나 생성자는 적합하지 않다.
인자가 20개가 넘은 상황에서는 무슨 패턴을 사용해야 할까?

 

인자가 많을 시 주로 사용하는 패턴

1) 점층적 생성자 패턴

2) 자바빈 패턴

3) 빌더 패턴

 

 

1) 점층적 생성자 패턴 - 많은 인자 개수에 적합하지 못하다.

 

점층적 생성자 패턴을 잘 동작하지만 인자 수가 늘어나면 클라이언트 코드를 작성하기가 어려워지고, 무엇보다 읽기 어려운 코드가 되고 만다.

 

2) 자바빈 패턴 - 일관성 훼손이 가능하고, 항상 변경 가능하다.

 

1회의 함수 호출로 객체 생성을 끝낼 수 없으므로, 객체 일관성이 일시적으로 깨질 수 있다는 것이다.

또한 객체를 수정하는 설정자가 있으므로 자바빈 패턴으로는 객체를 수정할 수없는 클래스인 변경 불가능(immutable) 클래스를 만들 수 없다.

 

 

 

3) 빌더 패턴 - 필요한 객체를 직접 생성하는 대신, 클라이언트는 먼저 필수 인자들을 생성자에 전부 전달하여 빌더 객체(builder object)를 만든다.

빌터패턴의 장점 :

빌더 객체는 여러개 varArgs 인자를 받을 수 있다.

(설정 메서드마다 하나씩 필요한 만큼 varArgs인자를 사용 가능)

유연성, 하나의 빌더 객체로 여러 객체를 만들 수 있다

(다른 객체를 생성해야 할 때마다 빌더 객체의 설정 메서드를 호출하면 다음 생성될 객체를 바꿀 수 있다)

 

빌터패턴의 단점 :

객체를 생성하려면 우선 빌더 객체를 생성해야 한다. (성능이 중요할 때 고려사항)

점층적 생성자 패턴보다 많은 코드를 요구 (인자 4개 이상에서 사용 권장)

 

 

 

**JDK 1.5버전 이상일경우 제네릭 자료형을 통해 어떤 자료형의 객체를 만드는 빌더냐에 관계없이 모든 빌더에 적용할 수 있다.
//자료형이 T인 객체에 대한 빌더
public interface Builder<T> {
	public T build();
}

이런 인터페이스를 통해 NutritionFacts.Builder클래스는 Builder <NutritionFacts>를 implement를 하도록 선언할 수 있으며 컴파일 시점에 예외검사가 가능해야한다는 규칙을 피할 수 있다.

빌더 패턴은 인자가 많은 생성자나 정적 팩터리가 필요한 클래스를 설계할 때, 특히 대부분의 인자가 선택적 인자인 상황에 유용하다. 클라이언트 코드 가독성은 점층적 생성자 패턴을 사용할 때 보다 좋아질 것이며 자바빈을 사용할 때보다 훨씬 안전할 것이다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유