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=false
oucallSuper=true
?
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.
@EqualsAndHashCode(callSuper=true)
devrait résoudre l'avertissement.
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.