[@Builder] 상속한 클래스의

(@Builder) 상속된 클래스의 멤버도 사용하여 빌더 생성

  1. @Builder 주석을 사용하는 경우 상속된 클래스의 멤버를 사용하려고 하면 오류가 발생합니다.
    확인할 수 있습니다.
@Getter
@AllArgsConstructor
public class Parent {
    private final String parentName;
    private final int parentAge;
}

@Getter
@Builder
public class Child extends Parent {
    private final String childName;
    private final int childAge;
}
  • 예를 들어 위의 코드처럼 Parent를 상속받은 Child의 빌더를 사용하려고 하면 에러가 발생합니다.
    이는 Lombok이 상위 클래스의 멤버 변수를 고려하지 않고 현재 클래스의 멤버 변수만 고려하기 때문입니다.
    ( = 빌더로 자식을 생성하면 parentName, parentAge 로 자식을 생성할 수 없음)

@Getter
@AllArgsConstructor
public class Parent {
    private final String parentName;
    private final int parentAge;
}

@Getter
public class Child extends Parent {
    private final String childName;
    private final int childAge;

    @Builder
    public Child(String parentName, int parentAge, String childName, int childAge) {
        super(parentName, parentAge);
        this.childName = childName;
        this.childAge = childAge;
    }
}
  • 이 경우, 명시적으로 직접 생성자를 생성하고 @Builder를 연결하여 해결할 수 있습니다.
  • 이 방법이 귀찮다면 Lombok의 @SuperBuilder를 이용하는 방법도 있습니다.

롬복 @SuperBuilder( v1.18.2. 후에)

또한 수퍼클래스의 필드가 있는 빌더입니다.

@Getter
@SuperBuilder
public class Parent {
    // same as before...

@Getter
@SuperBuilder
public class Child extends Parent {
   // same as before...

@Getter
@SuperBuilder
public class Student extends Child {
   // same as before...
  • @SuperBuilder는 상속 관계의 모든 클래스에 연결되어야 합니다.
  • @Builder와 호환되지 않습니다.
    즉, 두 개의 주석 중 하나만 첨부하면 됩니다.

참고