@Builder??
@Builder가 무엇이고 어떻게 사용하는지 사용하면 뭐가 좋은지 알아보자
@Builder란?
Builder 어노테이션은 롬복에 포함되어있는 어노테이션중에 하나로 오브젝트 생성을 위한 디자인 패턴중에 하나이다.
예를들어
1 |
|
이런식으로 builder패턴을 사용하여 인스턴스를 초기화 하는 방식은 생성자를 사용해서 초기화하는 방식이랑 유사하지만 builder패턴의 장점은 순서를 기억할 필요가 없다는 것이다
위 말을 다른 말로 하면 어떤 필드에 파라미터가 잘 전달되었는지 알 수 있다는 의미이다.
@Builder 사용할때 올바른 사용방법
- @Builder를 class에 달지 말자
class에 달게 되면 @AllArgsConstructor도 같이 달아주는것과 같기 때문에 바람직 하지 않다.
@AllArgsConstructor : 클래스에 존재하는 모든 필드에 대한 생성자 만들어줌
@NoArgsConstructor : 기본 생성자 생성해줌
조금 번거롭겠지만 요즘 intellj에서 생성자도 자동 생성해주기 때문에
1
2
3
4
5@Builder public Person(String name, String city){ this.name = name; this.city = city; }
요런식으로 사용하자
-
Builder 이름으로 책임을 부여하자 단순히 @Builder 어노테이션만 붙이고 땡 하지 말고, 예를 들어 주문 시스템에서 사용자에게 환불해서 받을 주소을 입력 받아야 하는데 단순히
Address.build()
가 아니라- 지번주소로 환불
1
2
3
4
5@Builder(builderClassName = "ByNumberBuilder", builderMethodName = "ByNumberBuilder") public Refund(Number number, Order order){ this.address = number; this.order = order; }
- 도로명주소로 환불
1
2
3
4
5@Builder(builderClassName = "ByRoadBuilder", builderMethodName = "ByRoadBuilder") public Refund(Road road, Order order){ this.road = road; this.order = order; }
이처럼 지번주소 환불인 경우에는 지번주소를 입력받게 하고, 도로명 주소 환불인 경우에는 도로명 주소를 입력받게 해서 빌더의 이름으로 책임을 부여하고, 받아야 하는 인자도 명확해진다.
1
2
3
4Refund refund = Refund.ByNumberBuilder() .number(number) .order(order) .build();
1
2
3
4Refund refund = Refund.ByRoadBuilder() .road(road) .order(order) .build();
- 지번주소로 환불