Comment puis-je remplacer la méthode des égaux de la classe d'objet?
IE J'ai p> Je veux convertir le paramètre obj en une personne de type, mais si Je fais (personne) obj Cela ne fonctionnera pas. P> p>
9 Réponses :
Vous pouvez le jeter à l'intérieur de la méthode, assurez-vous simplement que c'est du type droit à l'aide d'une instance de
Et j'ai pensé à une personne autreperson = (personne) obj; Merci
C'est en fait plus compliqué que vous pourriez penser. Avoir éclipse (ou quel que soit l'IDE que vous utilisez) génère automatiquement un Voir aussi ici: http://www.javapractices.com/topic/ TopicAction.do?id=17 P> est égal à la méthode code>; Vous verrez qu'il contient quelques chèques et jetons avant de faire une comparaison. P>
@Override
public boolean equals(Object o)
{
if (o instanceof Person)
{
Person c = (Person) o;
if ( this.FIELD.equals(c.FIELD) ) //whatever here
return true;
}
return false;
}
Beaucoup je n'aime pas ce code, mais je suis obligé de +1 pour @override code>.
Jetez un coup d'œil à En ce qui concerne la comparaison d'objets . P>
Sachez que si vous remplacez égale () code> vous hashcode () code>. Le contrat EQUAL / HASHCODE est que si deux objets sont égaux, ils doivent avoir le même code de hachage. P>
Si vous envisagez de créer des sous-classes de personne, utilisez quelque chose comme p>
si (obj! = null && obj.getclass () == personne.class) p>
plutôt que l'instance de p>
Pourquoi utiliserait-on GetClass () au lieu de l'instance de? (Juste curieux.)
par exemple. Si l'employé étend la personne; et employé a des champs supplémentaires comme ID, etc. Vous pouvez obtenir un faux positif à l'aide de la personne.Equals (employé)
Ce n'est pas tellement les faux positifs que vous devez vous inquiéter, mais la violation de la réflexivité b>. Indépendamment de ce que vous utilisez, vous pouvez essentiellement garantir que nouvel employé (). Equals (nouvelle personne ()) code> va être faux (la personne n'est pas une instance d'employé). Le résultat doit être le même si vous inverser les arguments, une personne ne peut pas b> être égale à une sous-classe d'elle-même (sauf si vous faites quelque chose de très funky dans la sous-classe ' Equals () Code> Méthode).
En outre, je préférerais que l'exemple de lecture si (obj! = Null && obj.getclass () == this.getclass ()) code> car cela fonctionnera correctement lorsqu'il est hérité lorsqu'il est hérité par des sous-classes. L'exemple de votre réponse en ce moment entraînerait une instance d'une sous-classe non égale à elle-même (sauf si elle ne remplace égale ()), ce qui est également faux.
La seule raison d'utiliser dire que nous avons un Dans certains cas, ce dernier pourrait être préféré, mais rarement en cas de comparaison des instances dans getclass () code> plutôt que instanceof code> est si on voulait affirmer que les deux références sont comparées sur des objets de la même classe plutôt que des objets Mise en œuvre de la même classe de base. P>
employé code> e strong> et a manager code> m fort> (étend employé code >). p>
M Système d'employé code> donnerait true, m.geclass () == employé.class code> retournerait faux. P>
égales () code> ou hashcode () code> méthodes. P>
Un point de plus peut être bon de savoir que, après avoir remplacé Equals () code> méthode (ainsi que hashcode () code>) Méthode Vous pouvez comparer deux objets de même classe Comme suit:
Je sais que cela est répondu, mais dans mes voyages, j'ai trouvé cela le moyen le plus efficace de remplacer la comparaison d'un objet pour vous assurer qu'il se produise dans le monde:
Je préfère les objets simples, Null-Safe (R) Objets.equaux Code> Pour tout type de champ: @Override
public boolean equals(Object o) {
if (o instanceof Person) {
Person p = (Person) o;
return Objects.equals(p.FIELD, this.FIELD);
}
return false;
}
Note Vous devez faire attention si vous avez une classe non finale. Généralement, vous devriez vérifier la classe d'exécution avec
obj.getclass () == personne code> plutôt queinstance de personne code>. Bien qu'il soit possible d'écrire un contrat qui rend les types dérivés égaux (commejava.util.list code>). Vous devriez également remplacerhashcode code> si vous remplacezégale code>, mais cela va probablement aller de l'avant un peu.