Home 상속에서 @Builder 사용하기
Post
Cancel

상속에서 @Builder 사용하기

상속에서 @Builder 사용하기

🐛 문제 상황

error: builder() in 자식객체 cannot hide builder() in 부모객체

라는 에러가 나오게 된다. 간단하게 직역하면 “자식객체의 builder()는 부모객체의 builder()에 숨을 수 없다.”라는 말인데 이것을 해결하려면 상속에 대한 기본적인 개념이 있어야한다.

🏴‍☠️ 원인

Builder 어노테이션을 사용하면 컴파일 시 해당 클래스에 Builder 클래스와 메소드가 생기게 된다.

자식 객체에서 동일하게 Builder 어노테이션을 사용하게 되면 builder() 메소드가 중복되게 되면서 error가 발생하게 된다.

♻ 해결법

자식객체 또는 부모객체에서 @Builder어노테이션의 property중 하나인 builderMethodName를 설정해주면 된다. 물론 사용할 때는 builderMethodName에서 지정해준 method 명을 사용해서 호출해야 한다.

😎 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Getter
@Builder
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class FeedResponse {

    private Long feedId;
    private String title;
    private String description;
    private Integer price;
    private List<String> tags;
    private String photo;
    private LocalDateTime lastModifyDate;
    private boolean like;
    private Integer count;

    public void setLike(boolean value) {
        this.like = value;
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Getter
@JsonInclude(JsonInclude.Include.NON_NULL)
public class WriteFeedResponse extends FeedResponse {

    private Integer headCount;
    private LocalDate date;
    private boolean isUsedItem;

    @Builder(builderMethodName = "writeFeedResponseBuilder")
    public WriteFeedResponse(Long feedId, String title, String description,
			Integer price, List<String> tags, String photo,
			LocalDateTime lastModifyDate, boolean like, Integer count,
			Integer headCount, LocalDate date, boolean isUsedItem) {
    	super(feedId, title, description, price,
				tags, photo, lastModifyDate, like, count);
    	this.headCount = headCount;
    	this.date = date;
    	this.isUsedItem = isUsedItem;
	}

    public void setGroupFeed(Integer headCount, LocalDate date) {
        this.headCount = headCount;
        this.date = date;
    }

    public void setLike(boolean value) {
        super.setLike(value);
    }

}

아래는 실제 메소드 호출 시 사용법이다.

1
2
3
4
WriteFeedResponse feedResponse = 
    WriteFeedResponse.writeFeedResponseBuilder()
    .build();
    
This post is licensed under CC BY 4.0 by the author.