본문 바로가기
프로그래밍 언어/Java

이펙티브 자바 - 아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라

by 데브조이 2024. 8. 13.
반응형
이펙티브 자바(Effective java) 를 읽고 정리한 글입니다. 

 

정적 팩터리 메서드, 생성자는 선택적 매개변수가 많을 때 적절한 대응을 하기 어렵다는 제약을 가진다. 

 

물론 점층적 생성자 패턴(telescoping constructor pattern)을 사용할 수 있지만, 매개변수 개수가 증가하면 클라이언트 코드를 작성하거나 읽기 어려워진다. 또한 타입이 같은 매개변수의 순서를 바꾸는 등 개발자가 실수하기 쉽다.

 

다른 방법으로 setter를 사용하는 자바빈즈 패턴 방식이 있지만, 객체를 생성하기 위해 다수의 메서드를 호출해야 하고, 객체 생성 전까지 일관성이 유지되지 않는다. 즉, 객체의 불변성이 유지되지 않는다.

 

빌더 패턴(builder pattern)은 점층적 생성자 패턴의 안전성과 자바빈즈 패턴의 가독성을 겸비한 대안이 될 수 있다. 

그럼 빌더 패턴의 특징에 대해 알아보자.


흐름

1. 클라이언트는 필수 매개변수만 사용하여 생성자를 호출해 빌더 객체를 얻는다.

2. 빌더 객체의 세터 메서드로 매개변수를 설정한다.

3. build() 를 호출하여 생성하고자 하는 객체를 얻는다.

 

일반적으로 빌더는 생성할 클래스 안에 정적 멤버 클래스로 만들어둔다.


장점

1. 빌더의 세터 메서드들은 빌더 자신을 반환하여, 연쇄적으로 호출이 가능하다.
→플루언트 API, 메서드 연쇄(method chaining)

2. 빌더 패턴은 계층적으로 설계된 클래스와 함께 쓰기 좋다.
→ 각 계층의 클래스에 관련 빌더를 멤버로 정의하자.

3. 빌더를 사용하면 가변인수 매개변수를 여러 개 사용할 수 있다.

 


단점

빌더 패턴을 사용하려면 빌더를 만들어야 한다.

생성 비용이 크지는 않지만, 고려하는 것이 좋다.

점진적 생성자 패턴을 사용하는 것에 비해, 작성되는 코드가 많기 때문에 매개변수가 4개 이상은 되어야 값어치를 할 수 있다.

하지만 API는 시간이 지날수록 매개변수가 많아지는 경향이 있다.


요약

처리해야 할 매개변수가 많다면 생성자나 정적 팩터리 대신 빌더 패턴을 사용하자.

반응형