Наследование для строителей в ломбоке
Я пытался использовать ломбок для своего проекта.
У меня есть класс A:
@Data
@Builder
public class A {
Integer a1;
}
и класс B:
@Data
public class B extends A {
Integer b1;
@Builder
public B(Integer b1, Integer a1) {
super(a1);
this.b1 = b1;
}
}
Я получаю сообщение об ошибке, когда builder() в B не может переопределить builder() в A, поскольку тип возврата в BBuilder несовместим с типом возврата в ABuilder.
Есть ли способ сделать это с помощью ломбока? Я не хочу писать полный конструктор для B, если у меня нет другого варианта.
PS: Я дал явный конструктор для класса B из-за проблемы. Я пробовал искать, но я не мог найти хорошее решение для того же самого. Любая помощь действительно ценится.
Ответы
Ответ 1
Здесь нам просто нужно вызвать супер строителя.
@Data
public class B extends A {
Integer b1;
@Builder
public B(Integer b1, Integer a1) {
super(a1);
this.b1 = b1;
}
public static class BBuilder extends ABuilder{
BBuilder() {
super();
}
}
}
Ответ 2
Ломбок представил экспериментальные функции с версией: 1.18.2 для проблем наследования, связанных с аннотацией Builder, и может быть разрешен с помощью аннотации @SuperBuilder
Используйте версию lombok: 1.18.2, аннотации @SuperBuilder в классе child/parent
Ответ 3
Если вы используете Lombok 1.18.4 вместе с IntelliJ, вам подойдет следующий код:
@Data
@Builder
class A {
Integer a1;
}
@Data
class B extends A {
Integer b1;
@Builder (builderMethodName = "BBuilder")
public B(Integer b1, Integer a1) {
super(a1);
this.b1 = b1;
}
}
public class Main {
public static void main(String[] args){
System.out.println(B.BBuilder().a1(1).b1(1).build());
}
}
С другой стороны, аннотация @SuperBuilder не работала в IntelliJ во время написания этого ответа. Если у вас многоуровневое наследование, пожалуйста, избегайте Lombok, иначе это сделает ваши Java-модели беспорядочными.