Я читал другие вопросы, касающиеся строителя и наследования 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;
}
«Условие выигрыша»
Я бы хотел, чтобы Ломбок
- Распознавание полей, обязательных для родительского класса.
- Включить эти поля в сгенерированные построители дочерних классов.
В коде:
final FooInterface fooTest = FooTest.builder.foo("string").bar("string").build();
assertThat("string").equals(fooTest.getFoo());
assertThat("string").equals(fooTest.getBar());
Попытки решения
Проблема в том, что IntelliJ выделяет аннотацию @Data
с этой ошибкой:
Lombok нужен конструктор по умолчанию в базовом классе.
Если я удаляю @Data
из FooTest
, я получаю эту ошибку:
Нет конструктора по умолчанию, доступного в базовом классе .
Поэтому я удалил @SuperBuilder
из AbstractFoo
и добавил созданный вручную конструктор со всеми аргументами. Ошибка сохраняется. Я пробовал другие вещи и комбинации аннотаций, но ни одна из них не сработала.
Я также попытался - напрасно - установить для всех полей AbstractFoo
значение protected final
и объявить реализации Foo final
сами, что будет соответствовать моим бизнес-правилам.