@ Builder.Default в базовом классе не работает? - PullRequest
2 голосов
/ 17 мая 2019

Я пишу классы с аннотациями lombok, и у меня возникла проблема:

@AllArgsConstructor
@Data
public abstract class Base {
    protected static final int a = 1;
    @Builder.default
    protected int b = 1;
}

public static class Sub extends Base {
    @Builder
    Sub(final int b, final int c) {
        super(b);
        this.c = c;
    }
    private int c;
}

И @ Builder.default не работает, когда я пытаюсь построить подкласс, как этот:

Sub.builder()
   .c(100)

b должно быть значением по умолчанию 1, но на самом деле оно равно нулю.

Я обнаружил некоторые случаи, которые могут быть связаны с моим.Кажется, что super () несовместим с @ Builder.Default.Я до сих пор не знаю, как сделать b не нулевым.Кто-нибудь может помочь?Спасибо!

1 Ответ

3 голосов
/ 18 мая 2019

@Builder плохо работает с наследованием, потому что есть технические ограничения, которые могут делать процессоры аннотаций, такие как Lombok.Из-за этих ограничений Lombok не может установить связь между именем параметра и именем поля в суперклассе.(И это также концептуально сложно сделать, потому что вы могли бы назвать параметр по-другому, и тогда вам пришлось бы сделать более глубокий анализ кода.)

Если вы в порядке с использованием экспериментальных функций, вы могли бы@SuperBuilder попробуй.Добавьте его в оба класса и удалите ручной конструктор.(Обратите внимание, что @SuperBuilder еще не поддерживается в IntelliJ.)

Альтернативой также является использование ручного конструктора в суперклассе и установка там значения по умолчанию.

...