ITEM.2 생성자에 매개변수가 많다면 빌더를 고려하라.

Jaeho Kim·2022년 5월 28일
0

이펙티브자바

목록 보기
1/5
post-thumbnail

✏️ 이팩티브자바 ITEM2

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

Q 선택적 매개변수가 많을때 적절하게 대응하는 방법은?

  1. 생성자 오버로딩을 통해 여러가지 상황에 대응하기(Ex2-1)
    (점층적 생성자 패턴, telescoping constructor pattern)
    • 이런 방법은, VO가 복잡해질 경우 사용하기 어렵다.
  2. 자바빈즈 패턴 (JavaBeans pattern)(Ex2-2)
    • 매개변수가 없는 생성자로 객체를 만든 후, setter 메서드를 호출해 원하는 매개변수의 값을 설정하기
    • 하지만 이렇게 구현하면 하나의 객체를 생성하기 위해 여러 setter 메서드를 호출해야 하기 때문에 객체가 생성되기 전까지는 일관성이 무너진 상태에 놓이게 된다.
    • 이런 상황을 보완하기위해 freezing 개념이 존재하지만, 실전에서는 거의 사용하지 않고 런타임오류에 취약하다.

자바빈 지켜야할 규칙!
1. 기본생성자 사용. 리플렉션 사용등 객체생성의 어려움 극복
2. getter, setter 메소드 이름 규칙
3. 시리얼라이즈 인터페이스 구현

첫째로 생성자를 이용, 둘째로 생성자 대신 메서드를 이용했지만 이를 보완하고자 생긴 개념이 Bulider 개념.

  1. 빌더 패턴(Builder pattern)(Ex2-3)
    • 최초 필수값에 대한 매개변수만 Bulider 메서드로 넣어주고, 각 변수의 이름 메소드로 값을 선택적으로 주입한다. 마무리로 bulid 메소드를 실행하여 해당값들을 내포하고 있는 VO 완성
    • 생성자를 여러가지 만들지도, 메서드를 여러가지 만들지도 않으면서 최초 필수값에 대한 내용만 선언한 뒤에 필요에 의해 추가선언을 통해 주입하고, bulid 메소드를 통해 객체 생성
    • 위와같이, 줄줄이 메소드를 호출하는 방식을 플루언트 API(fluent API)혹은 메서드연쇄(method chaining) 라고 한다.
    • 또한 이런 메소드 체이닝을 통해 빌드하는 과정에서의 허용값 체크 과정을 거쳐야 하는데, 이때 에러는 IllegalArgumentException을 호출해야한다.

빌더 패턴의 예시 (Ex2-4)

  • self 예시가 중요! addTopping 메소드의 리턴타입을 T로 둠으로서 하위 클래스에서는 형변환하지 않고도 메서드 연쇄를 지원할 수 있다.
  • 생성자를 통해서 값을 주입하는게 아니기 때문에 빌더를 이용하면 가변인수 매개변수를 여러 개 사용 할 수 있다.

빌더 패턴의 단점 ?

  • 모든 객체를 생성하기 위해 빌더부터 만들어야한다.
  • 단순한 VO의 경우에는 값어치를 하기 힘들다. 하지만 나중에 장황해질 상황이 예상된다면 처음부터 빌더 패턴으로 만들자.

가변인수

메소드 가변인수를 자료형... 인스턴스과 같이 해당 타입의 배열 형태로 넣을 수 있다.

ex. main 메소드 생성시 String... args

profile
Hello, World!

0개의 댓글