2017-05-26 2 views
1

Je travaille sur un projet de test unitaire où les asserts appellent la méthode .equals. Cependant les personnes sur le projet avant n'ont pas généré ces méthodes.Toutes les classes doivent-elles avoir une méthode .equals et .hashcode?

Est-ce considéré comme une bonne pratique de générer automatiquement ces méthodes lorsque vous codez? Est-ce que tous les codeurs devraient le faire?

Je cherchais plus d'informations sur la méthode .equals et .hashcode et la plupart d'entre eux semblent être orientés vers la façon de les implémenter ou de les contourner.

+5

Dépend de l'objectif de la classe. Pour de nombreuses classes, l '"identité" implémentée par les méthodes 'equals' et' hashCode' héritées de 'Object' est très bien. – Henry

+0

Si vous avez besoin de comparer des objets de ces types, vous devez remplacer 'equals', et' hashCode', aussi 'hashCode' doit généralement être surchargé lorsque vous placez vos objets dans un hashmap (mais dans la plupart des cas pas nécessaire) . Généralement, si l'un est remplacé, l'autre est également remplacé. – SomeDude

+1

Il n'est jamais bon de * générer * automatiquement une méthode 'equals'. Peu de classes définissent logiquement leur identité par tous leurs champs d'état, ce que je suppose être ce que ferait une méthode 'equals' générée automatiquement. Si des instances doivent être vérifiées pour l'égalité, écrire une méthode sensible 'equals' et une méthode' hashCode' à la main. – VGR

Répondre

2

Il est surtout une question de goût - si vous ne prévoyez pas d'utiliser la méthode equals (par exemple, ne sont pas en utilisant assertEquals, signifie ne jamais utiliser cette classe comme une clé dans un Map, etc.), cela signifie que l'écriture vous écrivez peut-être du code mort, et certaines conventions préconiseraient de l'éviter.

Ici, il ne semble pas y avoir de question - si vous avez l'intention d'utiliser assertEquals, vous avez besoin d'une méthode equals implémentée. Si vous voulez l'implémenter, vous devez probablement également implémenter hashCode afin de protéger votre code contre les bogues sournois et difficiles à trouver.

+2

Vous semblez supposer que les attentes des assertions dans les tests OP ne sont pas congruentes avec l'implémentation 'equals()' que ses classes héritent de 'Object'. Ce n'est pas clair pour moi de la question que c'est le cas. –

+1

"Si vous avez l'intention d'utiliser assertEquals, vous avez besoin d'une méthode equals implémentée." Pourquoi cela serait-il? Si 'equals' est censé vérifier l'identité et donc pas surchargé, vous pouvez toujours utiliser' assertEquals'. – Kapep

+0

Ce n'est pas du tout une "question de goût". "Goût" n'a absolument rien à voir avec ça. C'est un conseil invalide. C'est une question de sémantique et entièrement déterminée par des principes d'ingénierie. Certainement rien de plus vague et indéfinissable que "goûter". –

0

La génération automatique de ces méthodes nous conduit à une implémentation standard. Une implémentation standard est codée dans Objet: comparaison des liens et calcul du code de hachage natif. À moins d'imaginer un autre ajustement d'implémentation standard pour toutes les entités de votre projet, vous ne devriez probablement pas générer automatiquement des égales et un code de hachage: implémentez-le manuellement, lorsque vous connaissez toutes les conditions d'une future comparaison.