2017-01-06 1 views
-1

Je comprends le contrat entre hashcode() et equals(). Ce que je ne comprends pas est que dois-je inclure tous les champs de ma classe (haricot) tout en calculant la même chose? par exemple. J'ai besoin d'utiliser mon objet bean dans une collection basée sur le hachage et nécessite un tri. La classe de bean contient ~ 25 champs.Dois-je tenir compte de tous les champs lors du calcul du hashcode() et de l'équation()?

Est-il nécessaire de prendre en compte tout son champ tout en remplaçant HashCode() et euqals()?

+4

No. Seuls les champs qui sont nécessaires pour la détermination de l ' « identité » (pour le code de hachage) - et quant aux égaux, cela dépend de vous. L'Object # par défaut est égal à seulement l'égalité de référence des tests. –

+0

@Elliot Selon ma compréhension, la meilleure pratique consiste à utiliser les mêmes champs dans hashcode() et equals(). – Diganta

+1

Comprenez-vous la différence entre * absolument nécessaire * et * meilleure pratique *? Que demandez-vous ici? –

Répondre

1

Il n'est certainement pas obligatoire d'utiliser tous les membres, mais je suggère de conserver toutes les variables qui changent d'objet en objet. Il peut y avoir des variables constantes ou même variables qui peuvent ne pas changer beaucoup d'objet en objet, vous pouvez les supprimer, s'il y a d'autres champs uniques.

J'ai même vu dans l'un du projet, en utilisant uniquement le champ "id" (unique d'un objet à l'autre) pour calculer le hashcode.

Edit: a aimé la suggestion de Dimitry dans la section commentaire, si dans le cas où vous voulez supprimer des champs ne cherchent: https://projectlombok.org/features/EqualsAndHashCode.html Attend propres

0

Vous ne devez pas remplacer les méthodes égales ni les méthodes hashCode sauf si cela est absolument nécessaire.

Lorsque vous avez besoin de le faire, essayez d'utiliser uniquement les champs qui rendent vos objets "uniques" parmi eux.

Afin de trier les objets, vous pouvez jeter un oeil à Comparator or Comparable interfaces que vous pouvez utiliser pour comparer des objets donnés un champ particulier ou un ensemble de champs.