Я читал другие вопросы, касающиеся построителя и наследования ломбока, но ни одно из решений не сработало. Использование 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;
}
«Условие победы»
Я хотел бы, чтобы Ломбок
- Распознавать поля, требуемые родительским классом.
- Включите эти поля в сгенерированные 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
, что соответствовало бы моим бизнес-правилам.
@SuperBuilder
. См. github.com/mplushnikov/lombok-intellij-plugin/issues/513 а> - person Jan Rieke   schedule 29.04.2019