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

Eclipse Java Discussion :

Mon("equal") != Eclipse("equa"l)


Sujet :

Eclipse Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Septembre 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2007
    Messages : 214
    Par défaut Mon("equal") != Eclipse("equa"l)
    Bonjour,

    J’ai une classe "Ville". J’ai défini à la main moi-même tout seul la méthode "equal". Voila le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public boolean equal(Ville o) {
    	if(this.nomVille!=o.nomVille) return false;
    	if(this.nbHabitants!=o.nbHabitants) return false;
    	if(this.nomPays!=o.nomPays) return false;
    	return true;
    }
    J’ai ensuite demandé à Eclipse de définir la méthode automatiquement. Voilà le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public boolean equals(Object obj) {
    	if (this == obj) return true;
    	if (obj == null) return false;
    	if (getClass() != obj.getClass()) return false;
     
    	Ville other = (Ville) obj;
    	if (nbHabitants != other.nbHabitants) return false;
    	if (nomPays == null) {
    		if (other.nomPays != null) return false;
    	} else {
                    if (!nomPays.equals(other.nomPays)) return false;
    	}
    	if (nomVille == null) {
    		if (other.nomVille != null) return false;
    	} else {
                    if (!nomVille.equals(other.nomVille)) return false;
    	}
    	return true;
    }
    J’ai un peu du mal à comprendre...

    Ligne 3 : obj==null : pourquoi retourner false ? Si mon objet this est null, et que obj est null, alors je devrais retourner true, non ?

    Christophe

  2. #2
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Bonjour,

    this n'est jamais null, il s'agit de l'objet qui "exécute" la méthode.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 7
    Par défaut
    En gros si tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Ville ville1 = null;
    Ville ville2 = null;
    if (ville1.equals(ville2)) {
      // Do something
    }
    Tu vas avoir un NullPointerException car ville1 n'est pas initialisé et il te sera impossible d’appeler une méthode de Ville.
    Notes aussi que ta méthode générée s'appelle "equals" et non "equal". Prends l'habitude de nommer ce genre de méthode ainsi car certaines classe utilise les méthodes "equals" de tes objets pour les trier par exemple.
    Avec un paramètre de type Object et un petit @Override au dessus de la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Override
    public boolean equals(Object o) {
      boolean result = false;
      // Do something
      return result;
    }

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Détail amusant :

    this n'est pas null, on le sait, d'accord.
    Mais s'il l'était, et que obj est null aussi, ce serait géré en ligne 2, qui renverrait true .
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre chevronné

    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Septembre 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2007
    Messages : 214
    Par défaut
    Donc, en supposant que je fais a1.equal(a2) :

    • this n'est jamais null
    • Si a1 est null, il ne peut pas appeler equal et ca lève une exception.
    • Si a1 n'est pas null mais que a2 est null, alors il faut retourner false, ce qui est fait ligne 3
    • Au passage, je comprends (grâce au post "valueOf(j).intValue() ou valueOf(j) ?") maintenant la ligne 2 : si a1 et a2 pointent sur la même chose, alors equal retourne true sans se soucier du reste.

    C'est ca ?

    Christophe

  6. #6
    Membre confirmé
    Homme Profil pro
    Chef de projet, développeur .net
    Inscrit en
    Juin 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet, développeur .net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 76
    Par défaut
    Oui, a la ligne 2 ou test les pointeurs. S'ils sont égaux, ils référencent la même instance, donc on renvoie true.

  7. #7
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    salut,

    j'ais juste une petite remarque au passage, généralement quand je redéfinis la méthode equal de mes Objets, j'utilise la méthode equalsIgnoreCase pour les attributs de type String dans le cas ou la casse n'est pas prise en compte.

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    this.nomVille().equalsIgnoreCase(obj.nomVille)

    sinon je vois pas l’intérêt de la redéfinir

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

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