web-dev-qa-db-fra.com

Warning est égal à/hashCode sur l'annotation @Data lombok avec héritage

J'ai une entité qui hérite des autres. D'autre part, j'utilise le projet Lombok pour réduire le code standard, donc je mets l'annotation @Data. L'annotation @Data avec héritage génère l'avertissement suivant:

Génération de l'implémentation equals/hashCode mais sans appel à superclass, même si cette classe ne s'étend pas à Java.lang.Object Si cela est intentionnel, ajoutez @EqualsAndHashCode(callSuper=false) à votre type.

Est-il conseillé d'ajouter l'annotation @EqualsAndHashCode (callSuper = true) ou @EqualsAndHashCode (callSuper = false)? Si ce n'est pas ajouté, Lequel est-ilcallSuper=falseoucallSuper=true?

46
Pau

La valeur default est false. C'est ce que vous obtenez si vous ne le spécifiez pas et ignorez l'avertissement.

Oui, il est recommandé d'ajouter une annotation @EqualsAndHashCode sur les classes annotées @Data qui étendent autre chose que Object. Je ne peux pas vous dire si vous avez besoin de true ou false, cela dépend de votre hiérarchie de classe et devra être examiné au cas par cas.

Cependant, pour un projet ou un package, vous pouvez configurer dans lombok.config pour appeler les super méthodes s'il ne s'agit pas d'une sous-classe directe d'Object.

lombok.equalsAndHashCode.callSuper = call

Consultez la documentation du système configuration pour en savoir plus sur son fonctionnement et la documentation @EqualsEndHashCode pour connaître les clés de configuration prises en charge.

Divulgation: Je suis un développeur Lombok.

68
Roel Spilker

@EqualsAndHashCode(callSuper=true) devrait résoudre l'avertissement. 

24
noscreenname

La principale question initiale est:

Est-il conseillé d'ajouter les annotations @EqualsAndHashCode (callSuper = True) ou @EqualsAndHashCode (callSuper = false)?

La réponse acceptée est fondamentalement juste: 

...ça dépend...

Pour en savoir plus, la documentation sur @EqualsAndHashCode contient des indications solides sur lesquelles choisir. Surtout cela, à mon humble avis:

En définissant callSuper sur true, vous pouvez inclure les égaux et hashCode méthodes de votre super-classe dans les méthodes générées. Pour hashCode, le Le résultat de super.hashCode () est inclus dans l'algorithme de hachage, et Forquals, la méthode générée retournera false si le super l'implémentation pense qu'il n'est pas égal à l'objet passé dans. Être conscient que toutes les implémentations égales ne gèrent pas cette situation correctement. Cependant, les implémentations égales générées par Lombok gèrent cette situation correctement, vous pouvez donc appeler votre super-classe en toute sécurité si elle aussi a une méthode equals générée par Lombok.

Pour résumer ceci un peu: Choisissez 'callSuper = true' si vous héritez d'une superclasse qui ne contient aucune information d'état, ou utilise elle-même l'annotation @Data, ou a des implémentations d'égaux/hash qui "gèrent le situation proprement "- ce que j’interprète comme renvoyant un hachage correct des valeurs de l’Etat. 

0
Adam Wise