포스트

lombok @Builder

lombok @Builder

이 글은 Tistory에서 이전된 포스팅입니다. 원본은 여기에서 확인할 수 있습니다.

클래스 레벨 @Builder

1
2
3
4
5
6
7
8
9
@Builder
public class Test {
    private String one;
    private Long two;

    public Test(Long two){
        this.two = two;
    }
}

lombok builder는 기본적으로 allArgsConstructor 로 동작한다.

그래서 위 코드에서 @Builder는 one, two를 인자로 받는 생성자를 사용하지만 정의되지 않은 생성자이므로 컴파일 에러가 발생한다. 정의된 건 two를 받는 생성자 뿐이다.

1
2
3
    public Test build() {
        return new Test(this.one, this.two);
    }

( 위 처럼 코드를 만들고 정의되지 않은 생성자로 에러가 발생할 것이다. )

생성자 레벨 @Builder

1
2
3
4
5
6
7
8
9
public class Test {
    private String one;
    private Long two;

    @Builder
    public Test(Long two){
        this.two = two;
    }
}

생성자 레벨 @Builder는 allArgsConstructor를 회피하고 의도대로 동작할 수 있다.

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
32
public class Test {
    private String one;
    private Long two;

    public Test(Long two) {
        this.two = two;
    }

    public static TestBuilder builder() {
        return new TestBuilder();
    }

    public static class TestBuilder {
        private Long two;

        TestBuilder() {
        }

        public TestBuilder two(final Long two) {
            this.two = two;
            return this;
        }

        public Test build() {
            return new Test(this.two);
        }

        public String toString() {
            return "Test.TestBuilder(two=" + this.two + ")";
        }
    }
}

생성자 레벨 @Builder에서 빌드된 코드를 보면 build 메서드가 two를 인자로 받는 생성자를 사용하는 것을 볼 수 있다.

결론

추가 옵션없이 @Builder를 사용한다면 생성자 레벨에서 사용하자.

참고 자료

https://velog.io/@park2348190/Lombok-Builder%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC

이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.