(@Builder) 상속된 클래스의 멤버도 사용하여 빌더 생성
- @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와 호환되지 않습니다.
즉, 두 개의 주석 중 하나만 첨부하면 됩니다.