sts plugin for java lombok

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.