Наследование построителя Lombok со сложной структурой классов

Я читал другие вопросы, касающиеся построителя и наследования ломбока, но ни одно из решений не сработало. Использование Lombok версии 1.18.4 и Java 11.

Я пытаюсь унаследовать родительский построитель, а также удовлетворять интерфейс, используя только неизменяемые поля. Это моя структура класса:

Код

public interface FooInterface {
    String getFoo();
}

Логика getFoo очень распространена во всех реализациях, поэтому я решил создать помощник Abstract, чтобы избежать копирования и вставки одного и того же кода повсюду.

@Data
@SuperBuilder
public abstract class AbstractFoo implements FooInterface {

    @Builder.Default
    private final String foo = "foo";

}

И фактическая реализация Foo:

@Data
@SuperBuilder
public class FooTest extends AbstractFoo {
    private final String bar;
}

«Условие победы»

Я хотел бы, чтобы Ломбок

  1. Распознавать поля, требуемые родительским классом.
  2. Включите эти поля в сгенерированные Builders дочерних классов.

В коде:

final FooInterface fooTest = FooTest.builder.foo("string").bar("string").build();
assertThat("string").equals(fooTest.getFoo());
assertThat("string").equals(fooTest.getBar());

Попытки решения

Проблема в том, что IntelliJ выделяет аннотацию @Data этой ошибкой:

Ломбоку нужен конструктор по умолчанию в базовом классе.

Если я удаляю @Data из FooTest, я получаю эту ошибку:

В базовом классе нет конструктора по умолчанию.

Поэтому я удалил @SuperBuilder из AbstractFoo и добавил созданный вручную конструктор со всеми аргументами. Ошибка сохраняется. Я пробовал другие вещи и комбинации аннотаций, но ни одна из них не сработала.

Я также пытался - тщетно - установить для всех полей AbstractFoo значение protected final и объявить реализации Foo final, что соответствовало бы моим бизнес-правилам.


person rath    schedule 28.04.2019    source источник
comment
Вы пробовали это без IntelliJ, т.е. прямая сборка на основе maven или gradle из консоли? Проблема может заключаться в том, что плагин IntelliJ Lombok не поддерживает @SuperBuilder. См. github.com/mplushnikov/lombok-intellij-plugin/issues/513   -  person Jan Rieke    schedule 29.04.2019


Ответы (1)


@SuperBuilder пока не поддерживается текущей версией подключаемого модуля IntelliJ IDEA.

В трекере проекта на Github есть открытая проблема — https://github.com/mplushnikov/lombok-intellij-plugin/issues/513

Хотя он предназначен для выпуска 0.25, который был выпущен всего несколько дней назад - https://github.com/mplushnikov/lombok-intellij-plugin/releases/tag/releasebuild_0.25

Проблема все еще кажется открытой и еще не реализованной.

Я бы посоветовал просто попробовать версию 0.25 и дождаться следующего релиза, если она не будет работать.

person Mikhail Kholodkov    schedule 03.05.2019
comment
Я также заметил бросающееся в глаза отсутствие @SuperBuilder в журналах последних выпусков. Нам просто нужно подождать тогда - person rath; 04.05.2019
comment
Похоже, что теперь он поддерживается в версии 0.27. plugins.jetbrains.com/plugin/6317-lombok - person David Conrad; 19.11.2019