[Java] 생성자의 매개변수가 많을 때는 빌더를 고려해라

1 분 소요

들어가며

많은 선택적 매개변수를 갖는 생성자에 대한 대응 방법을 알아보기 위한 포스팅이며 해당 게시글은 인프런 백기선 강사님의 이펙티브 자바 완벽 공략 1부 강의를 바탕으로 쓰였음을 미리 밝힙니다.

생성자 체인닝

  • 매개변수의 개수가 적은 생성자에서 매개변수의 개수가 큰 생성자를 점층적으로 호출하는 방식으로 설계할 수 있다.
  • 이 경우 매개변수의 개수가 몇 개인지, 각 매개변수가 의미하는 값의 의미가 무엇인지 헷갈릴 수 있다.
  • 매개변수의 순서나 개수가 다르더라도 컴파일 시점에 알아채기 어렵다.

자바빈즈 패턴

  • 기본 생성자와 setter를 통해 필드 초기화를 할 수 있다.
  • 객체 생성 시 초기화되어야 하는 필드값을 명시 및 강제하기 어렵다.
  • 많은 setter 메소드를 호출해야 하고 불변 객체를 만들기 어렵다. 따라서 런타임 도중 원치 않는 값의 변경이 발생할 수 있다.

빌더 패턴

  • 복잡한 객체를 만드는 프로세스를 독립적으로 분리
  • 필수 매개변수를 갖는 클래스의 빌더를 활용할 수 있다.
  • 빌더의 필수 매개변수를 통해 초기화되어야 하는 필드값을 강제할 수 있고 return this 구문을 통해 체이닝 형식으로 매개변수를 설정하여 객체를 생성할 수 있다.
  • 이 방법은 코드의 가독성이 조금은 떨어지고 코드 양이 많아진다.
  • lombok의 @Builder 애노테이션을 클래스 단위 또는 생성자 단위에 사용하게 되면 손쉽게 빌더 구현이 가능한다. 하지만 필수 매개변수를 강제할 수 없는 단점이 존재한다.

계층적 빌더

  • 공통되는 빌더 메소드를 추상형 빌더 클래스로 단일화할 수 있다.
  • 부모 클래스에서의 빌더는 재귀적 제네릭 타입과 self() 구문을 통해 자손 클래스의 빌더를 반환할 수 있도록 한다.
  • 위와 같은 방법으로 자손 클래스에만 존재하는 빌더의 메소드를 형변환 없이 간단히 사용할 수 있게 된다.

댓글남기기