IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Egalité entre 2 objets (equals)


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut Egalité entre 2 objets (equals)
    Bonjour, je voudrais écrire une méthode equals qui dit que 2 salariés sont égaux s'ils ont le même nom et le même numéro de matricule.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public boolean equals(Object ob) {
    		return ob instanceof Salarie && ((Salarie) ob).matricule
    				&& ((Salarie) ob).nom;
    Et dans eclipse, il me souligne toute la ligne en rouge et mentionne The operator && is undefined for the types boolean, int.

    j'arrive pas à comprendre merci

  2. #2
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    Bonjour,

    Il faut que tu teste les egalites des attributs entre ton instance courante et celle passée en paramètre.

    public boolean equals(Object ob) {
    return ob instanceof Salarie && ((Salarie) ob).matricule.equals(this.matricule)
    && ((Salarie) ob).nom.equals(this.nom);
    Il faudra remplacer equals par == si l'attribut est un type de base.
    Attentionégalement à tester quand les attributs sont null, ici si le matricule de l'instance passée en paramètre est null par exemple tu auras une exception.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut,
    Je suppose que matricule est un int et nom un String... Ici tu n'effectues aucun test sur tes valeurs, que veux dire "int et string" ? Je pense que tu veux tester si le matricule et le nom de l'autre salarié sont égaux aux matricule et nom de ce salarié, non ?
    Je ferais comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public boolean equals(Object ob) {
        if(ob==this)
            return true;
        if(ob == null || !(ob instanceof Salarie))
            return false;
     
        Salarie other = (Salarie)ob;
     
        return other.matricule == this.matricule && other.nom.equals(this.nom);
     
    }
    De plus surcharge la méthode hashCode pour être sûr que tu puisses faire des tests d'égalité correct avec des Set si besoin, voir le contrat ici
    Bon courage

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    A noter que la FAQ propose un modèle pour cela : Pourquoi et comment redéfinir la méthode equals() ?

    A noter que lorsqu'on redéfini equals() il est plus propre d'en faire de même pour hashCode()...

    a++

  5. #5
    Membre éclairé Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut
    Merci, pour vos reponses et j'ai aussi pensé à ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public boolean equals(Object ob) {
    		Salarie sal =(Salarie)ob;
    		return (sal.nom == this.nom && sal.matricule == this.matricule);
    ça marche ou dois-je absolument faire des testes de if avant?
    merci

  6. #6
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 703
    Par défaut
    Je suppose que nom est un String il faut donc utiliser .equals(...) et non == pour faire la comparaison.

    Pour ce qui est du test if(ob == null || !(ob instanceof Salarie)). Il permet d'eviter une ClassCastException si l'objet comparé n'est pas de la Classe Salarié ou d'une classe héritée de Salarie. Il evite également une NullPointerException si on compare à null.

  7. #7
    Membre éclairé Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Par défaut
    Merci Uther, j'ai très bien compris. Merci

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Par défaut
    Citation Envoyé par Uther Voir le message
    Je suppose que nom est un String il faut donc utiliser .equals(...) et non == pour faire la comparaison.

    Pour ce qui est du test if(ob == null || !(ob instanceof Salarie)). Il permet d'eviter une ClassCastException si l'objet comparé n'est pas de la Classe Salarié ou d'une classe héritée de Salarie. Il evite également une NullPointerException si on compare à null.
    Heu juste pour information, il me semble que "obj instanceof Class" renvoie false si obj est null, et non pas un NullPointerException, je me trompe ?

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par JohnNC Voir le message
    Heu juste pour information, il me semble que "obj instanceof Class" renvoie false si obj est null, et non pas un NullPointerException, je me trompe ?
    Tu ne te trompes pas c'est tout à fait cela

    a++

  10. #10
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 703
    Par défaut
    C'est tout a fait normal, tu ne compares pas le matricule et le nom à la valeur courante de l'objet. Il te faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public boolean equals(Object ob) {
      return ob instanceof Salarie 
               && ((Salarie) ob).matricule == this.matricule
               && ((Salarie) ob).nom.equals(this.nom);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Egalité entre objet
    Par la debutante dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 27/08/2007, 22h47
  2. [C++.NET] Egalite entre datatables
    Par raboin dans le forum VC++ .NET
    Réponses: 5
    Dernier message: 06/06/2006, 15h59
  3. [vector] Partager une même variable entre deux objets.
    Par Ekinoks dans le forum SL & STL
    Réponses: 18
    Dernier message: 25/08/2005, 20h40
  4. GLScene et les collisions entre les objets
    Par HopeLeaves dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 13/06/2005, 19h45
  5. Réponses: 4
    Dernier message: 25/09/2004, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo