생성자에 매개변수가 많으면 빌더 패턴을 고려하라

YaaaPyoung·2022년 4월 12일
0

이펙티브자바

목록 보기
2/3

2. 생성자에 매개변수가 많으면 빌더 패턴을 고려하라

1. 점층적 생성자 패턴 (Telescoping Constructor Pattern)

  • 생성자, 정적 팩토리 메소드를 사용해서 객체를 생성할 때 선택적 매개변수가 많은 경우는 어떻게 할까?
  • 필수 매개변수를 갖는 생성자, 선택적 매개변수 1개, 2개, 3개 ..... 형태로 생성자를 오버로딩하는 방식이다.
  • 이러한 방식은 설정하기 원치 않는 매개변수까지 설정해줘야하고 매개변수가 많아질수록 코드를 작성하거나 읽기도 어려워진다.

2. 자바 빈즈 패턴 (Java Beans Pattern)

  • 디폴트 생성자를 이용해서 객체를 생성한 후, setter 메소드를 통해 객체에 값을 할당하는 방법이다.
  • 가독성은 좋아졌을지언정 객체를 생성하기 위해서는 여러 메소드를 호출해야하며 모든 매개변수를 set 하기전까지는 객체가 일관성이 무너진 상태에 놓인다. 이러한 문제때문에 자바 빈즈 패턴에서는 클래스를 불변으로 만들 수 없다.

3. 빌더 패턴 (Builder Pattern)

  • 점층적 생성자 패턴과 자바 빈즈 패턴의 장점을 모아서 객체를 생성할 수 있는 패턴이다.
  • 필수 매개변수 값은 생성자를 호출해 빌더 객체를 얻고, 그 이후에 선택적으로 필요한 setter 메소드를 통해 값을 할당하고 마지막에 build 메소드를 통해 매개변수를 가지고 실제 얻고자 하는 객체를 생성해내는 방식이다.
  • 잘못된 매개변수를 최대한 일찍 발견하려면 빌더의 생성자와 메소드에서 매개변수를 검사하고 build 메소드가 호출하는 생성자에서 여러 매개변수들의 유효성 검사를 진행해서 어떤 변수가 잘못됐는지를 알려주는 메시지를 담아 illegalArgumentException을 던지면 된다.

생성자나 정적 팩토리 메소드가 처리해야할 매개변수가 많을 경우 빌더 패턴을 선택하는 것이 더 낫다. 매개변수 중 다수가 필수가 아니거나 같은 타입이면 더 그렇다. 빌더는 점층적인 생성자보다 클라이언트 코드를 읽고 쓰기가 훨씬 간결하고, 자바빈즈보다 훨씬 안전하다.

0개의 댓글