IT 관련 책 정리 및 후기/Java Effective E3

[Item2] 생성자에 매개변수가 많다면 빌더를 고려하라

JUN0126 2022. 5. 17. 01:37

클래스에 인스턴스를 만들기 위해서는 매개변수를 입력 받아 클래스를 생성해야한다 하지만 점점 많은 매개변수를 받게 될 경우 하나부터 N개의 매개변수에 대한 생성자를 각각 생성해주어야 하고 필요한 생성자를 골라서 생성해야한다.

이렇게 되면 코드상으로도 읽기 어려우며 코드의 양도 많아지게 된다.

 

점층적 생성자 패턴

 - 위와 같은 생성자 생성 패턴을 점층적 생성자 패턴 이라고 하는데 점층적 생성자 패턴 사용 시 타입이 같은 매개변수가 연달아 있으면 매개변수의 순서를 잘못 설정하여 지정해줘도 컴파일러는 알아차리지 못하고 런타임 단계에서 이상한 동작을 하게되어 매개변수가 많을 경우 안좋은 점 이 있다.

 

자바빈즈 패턴 (JavaBeans Pattern)

- 선택 매개변수가 많을 떄 활용하는 패턴으로 Setter를 구현하여 인스턴스를 만드는 패턴이다

- 객체 하나를 만들려면 메서드를 여러 개 호출해야 하고, 객체가 완전히 생성되기 전까지는 일관성이

  무너진 상태에 놓이게 된다.

- 자바빈즈 패턴에서는 클래스를 분변으로 만들 수 없으며, 스레드의 안정성을 얻기 위해선 프로그래머가

  추가 작업을 진행해야 한다.

 

빌더 패턴 (Builder Pattern) [Item 30]

 - 클라이언트는 필요한 객체를 직접 만드는 대신, 필수 매개변수만으로 생성자를 호출해 빌더 객체를 얻는다

 - 빌더의 세터 메서드들은 빌더 자신을 반환하기 때문에 연쇄적으로 호출 된다 (fluent API or method Chaining)

 - 잘못된 매개변수를 가장 먼저 발견하려면 빌더의 생성자와 메서드에서 validation 실행, 이상 시 예외 발생

 - 계층적으로 설계된 클래스와 함께 쓰기 좋다

 - 가변인수 매개변수를 여러 개 사용할 수 있다.

 - 빌더 하나로 여러 객체를 순회하면서 만들 수 있고, 빌더에 넘기는 매개변수에 따라 다른 객체를 만들 수도 있다.

 

EX) BuilderFactory bf = new BuilderFactory.Builder(200,100) // 필수 매개변수

                                                       .name("lee").age(30).build(); // 선택적 매개변수 설정

 

⁕ 생성자나 정적 팩터리가 처리해야 할 매개변수가 많다면 빌더 패턴을 선택하는 게 낫다.