2013-04-28 4 views
2

J'ai un objet d'entreprise avec différents départements et employés. J'ai réussi à sérialiser mon objet et l'ai chargé de nouveau dans mon programme.Teste si deux objets sont structurellement égaux?

Maintenant je veux tester si ces deux objets sont structurellement égaux. Est-ce que java m'offre un outil pour comparer ces objets?

Je devrais ajouter que mon objet a une liste remplie d'autres objets.

Ou dois-je écrire mon propre test pour cela?

modifier:

class test{ 

public int a 

} 
test t = new test(); 
t.a = 1; 

test t1 = new test(); 
t1.a = 1; 

maintenant je veux comparer t et t1 si elles sont les mêmes en fonction de leurs valeurs.

+1

juste vérifier si elles sont l'instance de la même classe en utilisant la fonction 'isinstance' –

+8

Qu'entendez-vous par« structurellement égal »? –

+0

Jetez un oeil à http://commons.apache.org/proper/commons-beanutils//api/org/apache/commons/beanutils/BeanComparator.html –

Répondre

5

Vous pouvez remplacer les equals la méthode dans la classe Test comme suit:

public boolean equals(Object other) { 
    if (other == null) { 
     return false; 
    } 
    if (!(other instanceof Test)) { 
     return false; 
    } 
    return this.a == ((Test) other).a; 
} 

Également: Lorsque le remplacement est égal à, vous devez toujours toujours remplacer la méthode hashCode. S'il vous plaît voir cette référence pour pourquoi: Why always override hashcode() if overriding equals()?

+5

Toujours remplacer le hashcode en cas de dépassement. Cela devrait faire partie de votre réponse. La signature de votre méthode est incorrecte. -1 jusqu'à ce que vous corrigiez cela car ce que vous recommandez ne fonctionnera pas et pire encore induira en erreur. Astuce: le paramètre de la méthode! –

+1

Si vous utilisez Eclipse, il peut générer hashCode et est égal à vous. – Thierry

+0

@HovercraftFullOfEels: Oups. Edité. –

2

On dirait que vous pouvez comparer avec redéfinie equals méthode que je pense ...

2

Google Goyave fournit ComparisonChain:

public int compareTo(Foo that) { 
    return ComparisonChain.start() 
     .compare(this.aString, that.aString) 
     .compare(this.anInt, that.anInt) 
     .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast()) 
     .result(); 
    } 

Apache Commons fournit CompareToBuilder:

public int compareTo(Object o) { 
    MyClass myClass = (MyClass) o; 
    return new CompareToBuilder() 
     .appendSuper(super.compareTo(o) 
     .append(this.field1, myClass.field1) 
     .append(this.field2, myClass.field2) 
     .append(this.field3, myClass.field3) 
     .toComparison(); 
    } 
} 
Questions connexes