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 :

Comparer deux structures d'objets


Sujet :

Langage Java

  1. #1
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut Comparer deux structures d'objets
    Je suis en train d'écrire un test unitaire qui est censé vérifier que deux structures d'objets sont identiques. J'ai redéfini les méthodes equals() et hashCode() de tous les noeuds de ma structure, mais quand je lance le test, il me dit juste que les deux structures ne sont pas égales.

    Est-ce que quelqu'un connait un outil ou une méthode pour faire une espèce de diff entre deux structures d'objets?

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par rozwel
    Je suis en train d'écrire un test unitaire qui est censé vérifier que deux structures d'objets sont identiques. J'ai redéfini les méthodes equals() et hashCode() de tous les noeuds de ma structure, mais quand je lance le test, il me dit juste que les deux structures ne sont pas égales.

    Est-ce que quelqu'un connait un outil ou une méthode pour faire une espèce de diff entre deux structures d'objets?
    Montre nous ta méthode equals() qu'on voie s'il y a quelque chose à changer

  3. #3
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    C'est une méthode equals standard générée par CommonClipse:
    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
    20
    21
    22
     
    /**
         * @see java.lang.Object#equals(Object)
         */
        public boolean equals(Object object)
        {
            if (object == this) {
                return true;
            }
            if (!(object instanceof ProcedureDetail)) {
                return false;
            }
            ProcedureDetail rhs = (ProcedureDetail) object;
            return new EqualsBuilder()
                    .appendSuper(super.equals(object))
                    .append(this.sigle, rhs.sigle)
                    .append(this.title, rhs.title)
                    .append(this.associatedDocuments, rhs.associatedDocuments)
                    .append(this.activeReferral, rhs.activeReferral)
                    .append(this.baseDocument, rhs.baseDocument)
                    .isEquals();
        }

  4. #4
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Et ta classe EqualsBuilder, et standard elle aussi?

    Ce 'if' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (object == this) {
                return true;
            }
    n'est à mon avis pas très utile, il ne sera vrai que dans un cas, si tu compares ton objet avec lui meme. A moins que j'ai zappé quelque chose.

  5. #5
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Ok je viens de voir le but de EqualsBuilder.
    Vu que dans l'exemple ils font le test que j'ai dit qu'il ne servait à rien peut-etre sert-il mais je ne vois pas trop à quoi.

    Je pense que ton probleme vient du faite que tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .appendSuper(super.equals(object))

    ProcedureDetail est bien une classe à toi? Elle "implements" ou "extends" quelque chose?

    Peutx-tu mettre le code de procedureDetail ou au moins que l'on voit de quelle nature sont ces attributs.

  6. #6
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    Citation Envoyé par maxf1
    Et ta classe EqualsBuilder, et standard elle aussi?
    Presque. Elle fait partie des Commons-Utils d'Apache.

    Citation Envoyé par maxf1
    Ce 'if' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (object == this) {
                return true;
            }
    n'est à mon avis pas très utile, il ne sera vrai que dans un cas, si tu compares ton objet avec lui meme. A moins que j'ai zappé quelque chose.
    Non c'est tout à fait à ça que ça sert. Mais juste pour être un peu plus précis. Cet object est lié à d'autres objets, eux-mêmes liés à d'autres, etc. Tout ça dans une structure assez complexe qui heureusement possède une racine unique. Et c'est en appelant equals sur cette racine que toute la structure est parcourue.

  7. #7
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    Non le appendSuper() est justifié parce qu'effectivement ProcedureDetail est une classe à moi qui en étend une autre.

    Au fait, je n'ai aucun problème avec la méthode equals en elle-même, elle fait très bien son boulot. C'est juste que quand j'exécute mon test unitaire pour vérifier l'égalité des deux structures, il me manque de l'info pour vérifier où se trouvent les différences.

  8. #8
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Ok. Donc tu es dans ton test unitaire, et il te renvoi faux alors qu'il devrait te renvoyait vrai, c'est bien ca ton problème?

    EN faite je pensais que ProcedureDetail était toute simple et qu'elle héritait Object par exemple et que la méthode equals n'était pas bien défini sur celle si.

    En fait pour ton test unitaire, le plus simple serait de faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    boolean res = true;
    res = res && new EqualsBuilder().appendSuper(super.equals(object)).isEquals();
    res = res && new EqualsBuilder().append(this.sigle, rhs.sigle).isEquals();
    res = res && new EqualsBuilder().append(this.title, rhs.title).isEquals();                      
    res = res && new EqualsBuilder().append(this.associatedDocuments, rhs.associatedDocuments).isEquals();
    res = res && new EqualsBuilder().append(this.activeReferral, rhs.activeReferral).isEquals();
    res = res && new EqualsBuilder().append(this.baseDocument, rhs.baseDocument).isEquals();
    return res;
    Ca te permettra de voir ou est ce que ton equals est faux.

  9. #9
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    Difficilement envisageable pour des raisons à la fois pratiques et esthétiques.

    Pratiques parce que j'ai environ une trentaine de classes dans mon modèle et que j'ai déjà galéré en générant automatiquement le equals() pour chacune de ces classes avec CommonClipse dans Eclipse, et en repassant sur chaque méthode générée pour éviter les références circulaires. Alors si je dois commencer à réécrire tous les equals à la main, j'ai pas fini.

    Esthétiques parce que je perds tout l'intérêt d'utiliser EqualsBuilder à ce moment là.

    Je vais essayer de trouver autre chose. Merci quand même.

  10. #10
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    OUi mais en faite je voulais te faire réécrire cette methode uniquement pour savoir d'ou venait le probleme et de pouvoir mieux le cibler. Donc pour te donner une piste de ou cherchait "l'erreur".
    Car si tu ne sais pas pourquoi il te renvoi faux c'est un peu génant.

Discussions similaires

  1. Comment comparer deux structures xml
    Par HELKARROUMI dans le forum XSL/XSLT/XPATH
    Réponses: 0
    Dernier message: 20/05/2013, 18h46
  2. Comparer deux structures XML
    Par Cédric B. dans le forum Services Web
    Réponses: 1
    Dernier message: 08/07/2010, 10h15
  3. Souci pour comparer deux objets avec equals()
    Par xillibit dans le forum Langage
    Réponses: 7
    Dernier message: 30/09/2007, 16h41
  4. comparer deux objets
    Par root76 dans le forum Langage
    Réponses: 7
    Dernier message: 16/01/2007, 11h34
  5. comparer deux objets pas si simple ?
    Par StIcK dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2006, 21h55

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