2013-04-03 5 views
2

j'ai un objet agissant comme identifiant unique, qui a deux paramètres, nous les appellerons A et B, et a la logique suivante:Compute hashCode pour OU logique

obj1 est égal à obj2 si et seulement si:

obj1.A is equal to obj2.A 

OU

obj1.B is equal to obj2.B 

Comment puis-je calculer un contrat satisfaisant hashCode() pour cet objet? Suis-je coincé faire la solution horriblement inefficace de "retour 0 toujours"? Vous ne savez pas quel type de maths faire ici

Répondre

11

Votre méthode equals n'est pas transitive. Il ne respecte pas l'un des basic principles:

L'égal procédé met en oeuvre une relation d'équivalence sur les références d'objets non nuls:

Il est réflexive: pour toute valeur de référence non nul x, x. est égal à (x) devrait retourner vrai. Il est symétrique: pour toute valeur de référence non nulle x et y, x.equals (y) doit renvoyer true si et seulement si y.equals (x) renvoie true.

Il est transitive: pour toutes les valeurs de référence non nuls x, y et z, si x.equals (y) renvoie vrai et y.equals (z) renvoie vrai, puis x.equals (z) devrait retourner vrai.

Il est conforme: pour toutes les valeurs de référence non nuls x et y, de multiples invocations de x.equals (y) retour vrai ou faux revenir toujours constante, à condition qu'aucun information utilisée dans des comparaisons égale sur les objets est modifié. Pour toute valeur de référence non nulle x, x.equals (null) doit renvoyer false.

Cette logique « égalité » fait votre objet ne convient pas en tant que touches et vous ne pouvez pas résoudre ce problème en mettant au point une méthode simple hashCode,

Ne faites pas cette méthode equals mais utilisez votre propre sémantique, comme par exemple isEquivalentTo.

+0

Eh bien c'était plutôt stupide de ma part. Bonne prise, on dirait que j'ai besoin de rafraîchir un peu mes bases. Donc, je ne serai pas capable d'utiliser une clé unique comme je le pensais. – torquestomp