java - for - lombok plugin
cómo llamar a superconstructor en Lombok (5)
Esto no es posible en Lombok. Aunque sería una característica realmente agradable, requiere resolución para encontrar los constructores de la superclase. La súper clase solo se conoce por su nombre en el momento en que se invoca a Lombok. Usar las declaraciones de importación y el classpath para encontrar la clase real no es trivial. Y durante la compilación no puede usar simplemente la reflexión para obtener una lista de constructores.
No es del todo imposible, pero los resultados usando la resolución en
val
y
@ExtensionMethod
nos han enseñado que es difícil y propenso a errores.
Divulgación: Soy un desarrollador de Lombok.
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 (), 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?
Lombok no es compatible con lo que también se indica al hacer que cualquier clase anotada
@Value
final
(como sabes usando
@NonFinal
).
La única solución que encontré es declarar a todos los miembros como final y usar la anotación
@Data
lugar.
Esas subclases deben ser anotadas por
@EqualsAndHashCode
y necesitan un constructor explícito de todos los argumentos, ya que Lombok no sabe cómo crear uno usando todos los
@EqualsAndHashCode
de la
@EqualsAndHashCode
:
@Data
public class A {
private final int x;
private final int y;
}
@Data
@EqualsAndHashCode(callSuper = true)
public class B extends A {
private final int z;
public B(int x, int y, int z) {
super(x, y);
this.z = z;
}
}
Especialmente los constructores de las subclases hacen que la solución sea un poco desordenada para las superclases con muchos miembros, lo siento.
Si la clase secundaria tiene más miembros, que los padres, se podría hacer de manera no muy limpia, pero de manera corta:
@Data
@RequiredArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class User extends BaseEntity {
private @NonNull String fullName;
private @NonNull String email;
...
public User(Integer id, String fullName, String email, ....) {
this(fullName, email, ....);
this.id = id;
}
}
@Data
@AllArgsConstructor
abstract public class BaseEntity {
protected Integer id;
public boolean isNew() {
return id == null;
}
}
para superclases con muchos miembros, te sugiero que uses @Delegate
@Data
public class A {
@Delegate public class AInner{
private final int x;
private final int y;
}
}
@Data
@EqualsAndHashCode(callSuper = true)
public class B extends A {
private final int z;
public B(A.AInner a, int z) {
super(a);
this.z = z;
}
}
github.com/peichhorn/lombok-pg/issues/78 referencia a esta página https://www.donneo.de/2015/09/16/lomboks-builder-annotation-and-inheritance/ con esta encantadora explicación:
@AllArgsConstructor public class Parent { private String a; } public class Child extends Parent { private String b; @Builder public Child(String a, String b){ super(a); this.b = b; } }
Como resultado, puede usar el generador generado de esta manera:
Child.builder().a("testA").b("testB").build();
La documentación oficial explica esto, pero no señala explícitamente que puede facilitarlo de esta manera.
También encontré que esto funciona muy bien con Spring Data JPA.