J'ai une entité qui hérite des autres. D'un autre côté, j'utilise le projet lombok pour réduire le code standard, alors j'ai mis une @Data
annotation. L'annotation @Data
avec héritage produit l'avertissement suivant:
Génération de l'implémentation equals / hashCode mais sans appel à la superclasse, même si cette classe n'étend pas java.lang.Object. Si c'est intentionnel, ajoutez
@EqualsAndHashCode(callSuper=false)
à votre type.
Est-il conseillé d'ajouter une annotation @EqualsAndHashCode (callSuper = true)
ou @EqualsAndHashCode (callSuper = false)
? S'il n'est pas ajouté, lequel est-ce callSuper=false
ou callSuper=true
?
@EqualsAndHashCode(callSuper=true)
devrait résoudre l'avertissement.la source
@EqualsAndHashCode
résout l'avertissement.La principale question originale est:
La réponse acceptée est fondamentalement juste:
Pour développer cela, la documentation sur @EqualsAndHashCode propose des conseils solides sur le choix. Surtout cela, à mon humble avis:
Pour distiller un peu ceci: Choisissez 'callSuper = true' si vous héritez d'une superclasse qui n'a pas d'informations d'état, ou utilise elle-même l'annotation @Data, ou a des implémentations de equals / hash qui "gèrent la situation correctement" - ce que j'interprète comme signifiant renvoyer un hachage approprié des valeurs d'état.
la source
Si vous souhaitez également comparer les membres de la superclasse, utilisez
@EqualsAndHashCode(callSuper=true)
. Si, cependant, vous souhaitez comparer uniquement les champs de la classe actuelle, vous pouvez utiliser@EqualsAndHashCode(callSuper=false)
la valeur par défaut option .Si vous utilisez la fonction Delombok, vous pouvez voir que la différence est que lorsqu'elle est définie sur
true
cette ligne, elle est ajoutée à la méthode d' égalité généréeif (!super.equals(o)) return false;
. Si vous avez des membres dans la superclasse qui doivent être pris en compte lors de la comparaison de deux objets, alors il doit être défini sur true pour pouvoir comparer correctement.la source