@Setter 대신 @Builder을 쓰는 이유
@Builder
@Getter
@ToString
public static class Body {
private List<rpBean> rp = new ArrayList<>();; // 경로 탐색 옵션
@Builder
@Getter
@ToString
public static class rpBean {
private Integer Fee;
private Integer Road;
private Integer Route;
}
}
private RequestVo.Body rpBean(PathVo pathVo) {
List<RequestVo.Body.rpBean> rpBeanList = new ArrayList<>();
rpBeanList.add(RequestVo.Body.rpBean.builder()
.Fee(0)
.Road(0)
.Route(3)
.build());
return RequestVo.Body.builder()
.rp(rpBeanList)
}
List를 이렇게 add 해가며 쓰는 방법 뿐인걸까?? 내가 모르는 뭔가가 있을거야! 하며 봄
rpOptionBeanList.add 이렇게 하는 방법 말고 다른거 알려줘..
@Builder
@Getter
@ToString
public static class Body {
@Builder.Default
private List<rpBean> rp = new ArrayList<>(); // 경로 탐색 옵션
@Getter
@Builder
@ToString
public static class rpBean {
@Builder.Default
private Integer Fee = 0;
@Builder.Default
private Integer Road = 0;
@Builder.Default
private Integer Route = 3;
}
}
return RequestVo.Body.builder()
// 짠 이렇게 간단해졌다.
.rp(Collections.singletonList(RequestVo.Body.rpBean.builder().build()))
IntelliJ는 왜 Arrays.asList대신 Collections.singletonList를 추천해줄까?
Arrays.asList보다 Collections.singletonList가 메모리를 효율적으로 사용하므로 Collections.singletonList를 사용할 것을 권장하고 있다. 객체 배열 대신 단일 객체만을 저장하니 메모리 사용이 적을 것이라 예상할 수 있다.
또한 SingletonList는 ArrayList와는 다르게 불변이다. 따라서 add나 remove는 물론 set 등의 메소드 또한 사용하지 못한다. 만약 이를 호출하면 UnsupportedOperationException를 던진다.
즉, ArrayList는 List의 크기가 고정되어 있을 뿐 수정은 가능하다. 하지만 SingletonList는 불변으로 크기가 1로 고정되어있으며 수정 또한 불가능하다. 또한 후자를 사용해서 메모리를 아낄 수 있다.
또다른 타입의 빌더패턴
@Builder.Default
private SelectFieldsBean selectFields = new SelectFieldsBean("CENTER");
@Builder
@Getter
@ToString
public static class SelectFieldsBean {
private String geoType;
}
훗날엔 이 빌더패턴도 오래된 레거시가 되겠지?
좀 더 가독성 높은 , 좀 더 쉬운 방법이 나왔으면 좋겠다