빌더패턴 열심히 써보기

빙그르·2023년 7월 3일

JAVA

목록 보기
5/11

@Setter 대신 @Builder을 쓰는 이유

  1. @Setter보다 @Bulider의 가독성이 더 좋다
  2. 빌더 패턴은 불변성이다. .builder().build() 할때에만 값을 넣을 수 있다. 반대로 set은 여기저기서 쓰일 가능성이 있다. (유지보수의 어려움)
@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;
}

훗날엔 이 빌더패턴도 오래된 레거시가 되겠지?
좀 더 가독성 높은 , 좀 더 쉬운 방법이 나왔으면 좋겠다

0개의 댓글