Que fait égal (Object obj) faire?
Ive souvent trouvé une méthode equals dans des endroits différents. Que faut-il réellement faire? Est-il important que nous devons avoir cela dans chaque classe?
public boolean equals(Object obj)
{
if (obj == this)
{
return true;
}
if (obj == null)
{
return false;
}
if (obj instanceof Contact)
{
Contact other = (Contact)obj;
return other.getFirstName().equals(getFirstName()) &&
other.getLastName().equals(getLastName()) &&
other.getHomePhone().equals(getHomePhone()) &&
other.getCellPhone().equals(getCellPhone());
}
else
{
return false;
}
}
source d'informationauteur Best
Vous devez vous connecter pour publier un commentaire.
Il redéfinit "l'égalité" des objets.
Par défaut (défini dans
java.lang.Object
), un objet est égal à un autre objet que si c'est la même instance. Mais vous pouvez personnaliser l'égalité logique lorsque vous la remplacez.Par exemple,
java.lang.String
définit l'égalité en comparant le caractère interne de la matrice. C'est pourquoi:Même si vous ne pouvez pas besoin de test pour l'égalité, comme ça, les classes que vous utilisez ne. Par exemple implémentations de
List.contains(..)
etList.indexOf(..)
utilisation.equals(..)
.Vérifier la javadoc pour le contrat requis par la
equals(..)
méthode.Dans de nombreux cas, lors de la substitution
equals(..)
vous devez également remplacerhashCode()
(en utilisant les mêmes champs). C'est également spécifié dans la javadoc.Différentes classes ont des critères différents pour ce qui fait 2 objets de "l'égalité". Normalement, equals() renvoie true si c'est le même Objet:
Cette retournera false, même s'ils sont à la fois "Objet" des classes, ils ne sont pas de la même instance.
a.equals(a)
retournera true.Toutefois, dans des cas comme une Chaîne de caractères, vous pouvez avoir 2 instances différentes, mais la Chaîne de l'égalité est basée sur les caractères qui composent ces Chaînes:
Ce sont toutes différentes instances de la Chaîne, mais le premier est égal à retournera true parce qu'ils sont à la fois "exemple"mais la 2ème ne sera pas parce que "exemple" n'est pas "un autre".
Vous n'aurez pas besoin de redéfinir equals() pour chaque classe, seulement quand il y a un cas spécial pour l'égalité, comme une classe qui contient 3 Cordes, mais seulement la première Chaîne est utilisée pour déterminer l'égalité. Dans l'exemple que vous avez posté, il aurait pu y avoir un autre champ,
description
qui pourrait être différente pour les 2 différents "Contacts", mais 2 "Contacts" seront considérées comme égales si ces 4 critères de correspondance (prénom/nom de famille, et la maison/de la cellule des numéros de téléphone), tandis que la description correspondant ou ne correspondant pas à ne pas jouer si les 2 Contacts sont égaux.Mis à part tout donné par Bozho, il y a d'autres choses à connaître si une substitution est égal à:
quelque chose
.equals(null)
doit toujours retourner faux - c'est à dire la valeur null n'est pas égal à tout autre chose. Cette exigence est prise en charge dans le deuxième cas de votre code.s'il est vrai que quelque chose == autre chosepuis aussi quelque chose
.equals(
autre chose)
doit aussi être vrai. (c'est à dire des objets identiques doivent être égaux) Le premier si de votre code s'occupe de cela..equals
DOIT être symétrique pour les non-null objets, c'est à direa.equals(b)
doit être le même queb.equals(a)
. Parfois, cette exigence des pauses si vous êtes sous-classement et impérieuse d'égal à égal dans le parent de la classe et de la sous-classe. Est souvent synonyme contient un code commeif (!getClass().equals(other.getClass())) return false;
qu'au moins fait en sorte qu'un autre type d'objet ne sont pas égaux les uns avec les autres.Si vous remplacez
equals
vous DEVEZ également remplacerhashCode
tels que l'expression suivante est vraie:if (a.equals(b)) assert a.hashCode() == b.hashCode()
. I. e. le code de hachage de deux objets sont égaux les uns aux autres doit être le même. Notez que l'inverse n'est pas vrai: deux objets qui ont le même code de hachage peut ou peut ne pas être égale les unes des autres. En général, cette exigence est prise en charge par dérivation le hashCode de la même propriétés qui sont utilisées pour déterminer l'égalité pour un objet.Dans votre cas, la méthode hashCode pourrait être:
Comparable
qui compare deux objets s'ils sont plus petits, les plus grands ou égaux les uns aux autres,a.compareTo(b) == 0
devrait être vrai si et seulement sia.equalTo(b) == true
Dans de nombreuses IDEs (par exemple, Eclipse, IntelliJ IDEA, NetBeans) il y a des fonctions qui génèrent à la fois
equals
ethashCode
pour vous, ce qui vous évitant ainsi de fastidieuses et, éventuellement, le risque d'erreur de travail.La
equals
méthode est utilisée lorsque l'on veut savoir si deux objets sont équivalentes quelle que soit la définition des objets à trouver. Par exemple, pourString
objets, l'équivalence est de savoir si les deux objets représentent la même chaîne de caractères. Ainsi, les classes fournissent souvent de leur propre mise en œuvre deequals
qui fonctionne de la même façon qui est naturel pour cette classe.La
equals
méthode est différente de==
en ce que les derniers tests de l'identité de l'objet, qui est de savoir si les objets sont les mêmes (ce qui n'est pas nécessairement le même que l'équivalent).Il vous permet de re-définir les Objets qui sont à égalité, et qui n'est pas, par exemple, vous pouvez définir que deux
Person
objets comme égales si laPerson.ID
est le même ou si leWeight
est égal, selon la logique de votre application.Voir ceci: Substitution de la java de la méthode equals() de l'excentricité