[Java] 생성자의 매개변수가 많을 때는 빌더를 고려해라
들어가며
많은 선택적 매개변수를 갖는 생성자에 대한 대응 방법을 알아보기 위한 포스팅이며 해당 게시글은 인프런 백기선 강사님의 이펙티브 자바 완벽 공략 1부 강의를 바탕으로 쓰였음을 미리 밝힙니다.
생성자 체인닝
- 매개변수의 개수가 적은 생성자에서 매개변수의 개수가 큰 생성자를 점층적으로 호출하는 방식으로 설계할 수 있다.
- 이 경우 매개변수의 개수가 몇 개인지, 각 매개변수가 의미하는 값의 의미가 무엇인지 헷갈릴 수 있다.
- 매개변수의 순서나 개수가 다르더라도 컴파일 시점에 알아채기 어렵다.
자바빈즈 패턴
- 기본 생성자와 setter를 통해 필드 초기화를 할 수 있다.
- 객체 생성 시 초기화되어야 하는 필드값을 명시 및 강제하기 어렵다.
- 많은 setter 메소드를 호출해야 하고 불변 객체를 만들기 어렵다. 따라서 런타임 도중 원치 않는 값의 변경이 발생할 수 있다.
빌더 패턴
- 복잡한 객체를 만드는 프로세스를 독립적으로 분리
- 필수 매개변수를 갖는 클래스의 빌더를 활용할 수 있다.
- 빌더의 필수 매개변수를 통해 초기화되어야 하는 필드값을 강제할 수 있고
return this
구문을 통해 체이닝 형식으로 매개변수를 설정하여 객체를 생성할 수 있다. - 이 방법은 코드의 가독성이 조금은 떨어지고 코드 양이 많아진다.
- lombok의
@Builder
애노테이션을 클래스 단위 또는 생성자 단위에 사용하게 되면 손쉽게 빌더 구현이 가능한다. 하지만 필수 매개변수를 강제할 수 없는 단점이 존재한다.
계층적 빌더
- 공통되는 빌더 메소드를 추상형 빌더 클래스로 단일화할 수 있다.
- 부모 클래스에서의 빌더는 재귀적 제네릭 타입과
self()
구문을 통해 자손 클래스의 빌더를 반환할 수 있도록 한다. - 위와 같은 방법으로 자손 클래스에만 존재하는 빌더의 메소드를 형변환 없이 간단히 사용할 수 있게 된다.
댓글남기기