Tengo una clase
@Value
@NonFinal
public class A {
int x;
int y;
}
Tengo otra clase B
@Value
public class B extends A {
int z;
}
lombok arroja un error que dice que no puede encontrar el constructor A (), llámelo explícitamente, lo que quiero que lombok haga es dar una anotación a la clase b de modo que genere el siguiente código:
public class B extends A {
int z;
public B( int x, int y, int z) {
super( x , y );
this.z = z;
}
}
¿Tenemos una anotación para hacer eso en Lombok?
inConstructor
método para las anotaciones del constructor donde podamos especificar qué constructorsuper
debe inyectar Lombok en el constructor generado?Lombok Issue # 78 hace referencia a esta página https://www.donneo.de/2015/09/16/lomboks-builder-annotation-and-inheritance/ con esta hermosa explicación:
También encontré que esto funciona muy bien con Spring Data JPA.
fuente
Lombok no admite lo que también se indica al hacer cualquier
@Value
clase anotadafinal
(como sabes al usar@NonFinal
).La única solución que encontré es declarar todos los miembros finales usted mismo y usar la
@Data
anotación en su lugar. Esas subclases deben estar anotadas@EqualsAndHashCode
y necesitan un constructor de todos los args explícito, ya que Lombok no sabe cómo crear uno usando todos los args uno de la superclase:Especialmente los constructores de las subclases hacen que la solución sea un poco desordenada para superclases con muchos miembros, lo siento.
fuente
@EqualsAndHashCode
"? ¿No está incluida esta anotación@Data
? Thx :)@Data
también crea equals () y hashCode () pero no se preocupa por la herencia. Para asegurarse de que se use la superclase igual () y hashCode (), necesita la generación explícita con callSuperpara superclases con muchos miembros, le sugiero que use @Delegate
fuente
@Delegate
es@Target({ElementType.FIELD, ElementType.METHOD})
.AInner
debe estar en el campoA
.Si la clase secundaria tiene más miembros que los padres, se podría hacer de manera no muy limpia, pero corta:
fuente
La versión 1.18 de Lombok introdujo la anotación @SuperBuilder. Podemos usar esto para resolver nuestro problema de una manera más sencilla.
Puede consultar https://www.baeldung.com/lombok-builder-inheritance#lombok-builder-and-inheritance-3 .
así que en la clase de su hijo, necesitará estas anotaciones:
en tu clase para padres:
fuente
Como una opción que puede utilizar
com.fasterxml.jackson.databind.ObjectMapper
para inicializar una clase secundaria de padreAún puede usar cualquier
lombok
anotación en A y B si lo necesita.fuente