У меня есть класс
@Value
@NonFinal
public class A {
int x;
int y;
}
У меня другой класс Б
@Value
public class B extends A {
int z;
}
lombok выдает ошибку, говоря, что он не может найти конструктор A (), явно называть его то, что я хочу, чтобы lombok сделал, это дать аннотацию к классу b, чтобы он генерировал следующий код:
public class B extends A {
int z;
public B( int x, int y, int z) {
super( x , y );
this.z = z;
}
}
У нас есть аннотация для этого на Ломбоке?
inConstructor
метод для аннотаций конструктора, в котором мы можем указать, какой конструкторsuper
Lombok должен внедрить в сгенерированный конструктор?Выпуск № 78 Lombok ссылается на эту страницу https://www.donneo.de/2015/09/16/lomboks-builder-annotation-and-inheritance/ с этим прекрасным объяснением:
Я также обнаружил, что это хорошо работает с Spring Data JPA.
источник
Lombok не поддерживает то, что также указывается при создании любого
@Value
аннотированного классаfinal
(как вы знаете, используя@NonFinal
).Единственный обходной путь, который я нашел, - это объявить всех участников final самостоятельно и
@Data
вместо этого использовать аннотацию. Эти подклассы должны быть аннотированы@EqualsAndHashCode
и нуждаются в явном конструкторе всех аргументов, поскольку Lombok не знает, как создать его, используя все аргументы одного суперкласса:В частности, конструкторы подклассов делают решение немного неопрятным для суперклассов с большим количеством членов, извините.
источник
@EqualsAndHashCode
»? Разве эта аннотация не включена@Data
? Thx :)@Data
также создает equals () и hashCode (), но не заботится о наследовании. Чтобы убедиться, что используется суперкласс equals () и hashCode (), вам нужна явная генерация с помощью callSuperдля суперклассов с большим количеством членов я бы посоветовал вам использовать @Delegate
источник
@Delegate
есть@Target({ElementType.FIELD, ElementType.METHOD})
.AInner
должно быть поле вA
.Если у дочернего класса больше членов, чем у родительского, это можно сделать не очень чисто, но коротко:
источник
Версия 1.18 Lombok представила аннотацию @SuperBuilder. Мы можем использовать это, чтобы решить нашу проблему более простым способом.
Вы можете обратиться к https://www.baeldung.com/lombok-builder-inheritance#lombok-builder-and-inheritance-3 .
поэтому в вашем дочернем классе вам понадобятся эти аннотации:
в вашем родительском классе:
источник
Как вариант, вы можете использовать
com.fasterxml.jackson.databind.ObjectMapper
для инициализации дочернего класса от родительскогоВы все еще можете использовать любые
lombok
аннотации для A и B, если вам нужно.источник