je devais remplacer equals()
et comme il est recommandé aussi je réenregistrés la méthode hashCode()
en utilisant les mêmes champs. Puis, quand je regardais un ensemble, qui ne contenait que l'un objet que je suis le résultat frustrant de
set.contains(object)
=> false
tout
set.stream().findFirst().get().equals(object)
=> true
Je comprends maintenant, que cela est dû à des changements qui ont été faites à object
après il a été ajouté à set
qui a de nouveau changé son hashCode. contains
puis regarde la mauvaise clé et ne peut pas trouver le object
.
Mes exigences pour la mise en œuvre sont
- champs mutables sont nécessaires pour mettre en œuvre correctement l'utilisation
equals()
- ces objets en toute sécurité dans
Collections
hachage ouMaps
telles cendresHashSet
même si elles sont sujettes à des changements.
qui est en contradiction avec la convention que
equals()
ethashCode()
doivent utiliser les mêmes champs afin d'éviter des surprises (comme l'affirme ici: https://stackoverflow.com/a/22827702).
Question
Y at-il des dangers à utiliser un sous-ensemble de champs qui sont utilisés dans equals()
pour calculer hashCode()
au lieu d'utiliser tous?
Plus précisément cela signifierait: equals()
utilise un certain nombre de champs de l'objet alors que hashCode()
utilise uniquement les champs qui sont utilisés dans equals()
et qui sont immuables .
Je pense que cela devrait être correct, parce que
- le contract est fullfilled: objets égaux produiront le même hashCode, tandis que le même hashCode ne necesairly signifie pas que les objets sont les mêmes.
- Le hashCode d'un objet reste le même, même si un objet est exposé aux modifications et sera donc trouvé dans un
HashSet
avant et après ces modifications.
Related posts qui m'a aidé à comprendre mon problème, mais pas comment le résoudre: What issues should be considered when overriding equals and hashCode in Java? et Different fields for equals and hashcode