7
votes

Java Supprimer l'objet Equals () Méthode

Comment puis-je remplacer la méthode des égaux de la classe d'objet?

IE J'ai xxx

Je veux convertir le paramètre obj en une personne de type, mais si Je fais (personne) obj Cela ne fonctionnera pas.


1 commentaires

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 plutôt que instance de personne . Bien qu'il soit possible d'écrire un contrat qui rend les types dérivés égaux (comme java.util.list ). Vous devriez également remplacer hashcode si vous remplacez égale , mais cela va probablement aller de l'avant un peu.


9 Réponses :


8
votes

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 xxx


1 commentaires

Et j'ai pensé à une personne autreperson = (personne) obj; Merci



10
votes

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 est égal à la méthode ; Vous verrez qu'il contient quelques chèques et jetons avant de faire une comparaison.

Voir aussi ici: http://www.javapractices.com/topic/ TopicAction.do?id=17


0 commentaires

8
votes
@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;
}

1 commentaires

Beaucoup je n'aime pas ce code, mais je suis obligé de +1 pour @override .



5
votes

Jetez un coup d'œil à En ce qui concerne la comparaison d'objets .

Sachez que si vous remplacez égale () vous doit également remplacer hashcode () . Le contrat EQUAL / HASHCODE est que si deux objets sont égaux, ils doivent avoir le même code de hachage.


0 commentaires

3
votes

Si vous envisagez de créer des sous-classes de personne, utilisez quelque chose comme

si (obj! = null && obj.getclass () == personne.class)

plutôt que l'instance de


4 commentaires

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é . Indépendamment de ce que vous utilisez, vous pouvez essentiellement garantir que nouvel employé (). Equals (nouvelle personne ()) 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 être égale à une sous-classe d'elle-même (sauf si vous faites quelque chose de très funky dans la sous-classe ' Equals () Méthode).


En outre, je préférerais que l'exemple de lecture si (obj! = Null && obj.getclass () == this.getclass ()) 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.



2
votes

La seule raison d'utiliser getclass () plutôt que instanceof 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.

dire que nous avons un employé e et a manager m (étend employé ).

M Système d'employé donnerait true, m.geclass () == employé.class retournerait faux.

Dans certains cas, ce dernier pourrait être préféré, mais rarement en cas de comparaison des instances dans égales () ou hashcode () méthodes.


0 commentaires

0
votes

Un point de plus peut être bon de savoir que, après avoir remplacé Equals () méthode (ainsi que hashcode () ) Méthode Vous pouvez comparer deux objets de même classe Comme suit: xxx


0 commentaires

0
votes

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: xxx

ou si vous ne comparez pas de chaînes: xxx


0 commentaires

1
votes

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;
}


0 commentaires