j'ai un cours
@Value
@NonFinal
public class A {
int x;
int y;
}
J'ai une autre classe B
@Value
public class B extends A {
int z;
}
lombok lance une erreur disant qu'il ne trouve pas le constructeur A (), appelez-le explicitement ce que je veux que lombok fasse est de donner une annotation à la classe b de telle sorte qu'elle génère le code suivant:
public class B extends A {
int z;
public B( int x, int y, int z) {
super( x , y );
this.z = z;
}
}
Avons-nous une annotation pour faire cela à Lombok?
inConstructor
méthode pour les annotations de constructeur où nous pouvons spécifier quel constructeur desuper
Lombok injectera dans le constructeur généré?Le numéro 78 de Lombok fait référence à cette page https://www.donneo.de/2015/09/16/lomboks-builder-annotation-and-inheritance/ avec cette belle explication:
J'ai également trouvé que cela fonctionne bien avec Spring Data JPA.
la source
Lombok ne prend pas en charge cela également indiqué en créant une
@Value
classe annotéefinal
(comme vous le savez en utilisant@NonFinal
).La seule solution de contournement que j'ai trouvée est de déclarer tous les membres définitifs vous-même et d'utiliser l'
@Data
annotation à la place. Ces sous-classes doivent être annotées par@EqualsAndHashCode
et ont besoin d'un constructeur explicite all args car Lombok ne sait pas comment en créer une en utilisant la classe all args de la super classe:Surtout les constructeurs des sous-classes rendent la solution un peu désordonnée pour les superclasses avec de nombreux membres, désolé.
la source
@EqualsAndHashCode
»? Cette annotation n'est-elle pas incluse par@Data
? Thx :)@Data
crée également equals () et hashCode () mais ne se soucie d'aucun héritage. Pour vous assurer que la superclasse equals () et hashCode () est utilisée, vous avez besoin de la génération explicite avec callSuperpour les superclasses avec de nombreux membres, je vous suggère d'utiliser @Delegate
la source
@Delegate
est@Target({ElementType.FIELD, ElementType.METHOD})
.AInner
devrait être sur le terrainA
.Si la classe enfant a plus de membres que le parent, cela pourrait être fait pas très propre, mais de manière courte:
la source
La version 1.18 de Lombok a introduit l'annotation @SuperBuilder. Nous pouvons l'utiliser pour résoudre notre problème de manière plus simple.
Vous pouvez vous référer à https://www.baeldung.com/lombok-builder-inheritance#lombok-builder-and-inheritance-3 .
donc dans votre classe enfant, vous aurez besoin de ces annotations:
dans ta classe parentale:
la source
En option, vous pouvez utiliser
com.fasterxml.jackson.databind.ObjectMapper
pour initialiser une classe enfant à partir du parentVous pouvez toujours utiliser des
lombok
annotations sur A et B si vous en avez besoin.la source