Наследство для строителей на Ломбоке

Я пытался использовать ломбок для своего проекта.

У меня есть класс А:

@Data
@Builder
public class A {
    Integer a1;
}

и класс В:

@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 из-за проблемы< /а>. Я пытался искать, но я не мог найти хорошее решение для того же самого.


person Abhinav Aggarwal    schedule 10.06.2016    source источник


Ответы (4)


Здесь нам просто нужно вызвать супер строителя.

@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();
            }
    }
}
person Abhinav Aggarwal    schedule 10.06.2016
comment
Это решение не будет работать, если родительский класс также имеет аннотацию @Builder. - person realPK; 12.07.2019

Если вы используете 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-модели будут запутаны.

person realPK    schedule 12.07.2019

Lombok представил экспериментальные функции с версией: 1.18.2 для проблем наследования, с которыми сталкивается аннотация Builder, и могут быть решены с помощью аннотации @SuperBuilder.

Пожалуйста, используйте версию ломбока: 1.18.2, аннотации @SuperBuilder в дочернем/родительском классе

person Amit Kaneria    schedule 07.08.2018

Если в вашем родительском классе уже есть @Builder, то ваш дочерний класс должен быть помечен @SuperBuilder.

Наличие и родителя, и дочернего элемента в качестве @Builder не сработает.

Родительский класс A:

@Data
@Builder
public class A {
    Integer a1;
}

Дочерний класс B:

@Data
@SuperBuilder
public class B extends A {
    Integer b1;
}
person walv    schedule 30.04.2021