2009-10-05 8 views
2

J'ai un objet qui a lui-même plusieurs objets en tant que champs. La question que j'ai est, j'ai deux objets de ce genre et je veux comparer ces deux. Je sais que je peux faire des équivalents, des comparateurs, etc. mais y a-t-il un moyen d'utiliser la réflexion pour obtenir les propriétés de l'objet et faire la comparaison.java comparer des objets: en utilisant la réflexion?

par exemple, si j'ai un objet Car, qui, comme des roues objet, qui a des objets de pneus, qui a des objets boulons. S'il vous plaît rappelez-vous tous les objets ci-dessus sont des classes individuelles et non imbriquées. Comment puis-je comparer 2 objets de voiture?

Toute aide est appréciée?

Merci

+0

Voir http://stackoverflow.com/a/16361625/1767377 J'ai eu la réflexion de travailler sur deux objets. Essentiellement comparer deux objets d'un type inconnu. – SyntaxRules

Répondre

8
public class Car { 
    private Wheels wheels; 
    // other properties 

    public boolean equals(Object ob) { 
    if (!(ob instanceof Car)) return false; 
    Car other = (Car)ob; 
    // compare properties 
    if (!wheels.equals(other.wheels)) return false; 
    return true; 
    } 
} 

est l'approche correcte. La comparaison automatique par réflexion n'est pas recommandée. D'une part, «état» est un concept plus générique que la comparaison de propriété réfléchie.

Vous pourriez écrire quelque chose qui a fait une comparaison de réflexion profonde, mais il manque un peu le point.

+0

Vous devez ajouter des vérifications si ob == null renvoie false, si ob == cela renvoie true pour compléter la méthode equals. – Droo

+0

'instanceof' prendra en charge le cas null. Cette comparaison n'est pas nécessaire, bien que cela puisse aider à la performance. Ce qui est probablement faux est l'utilisation de 'instanceof' avec une classe non -final' - faites la classe' final' (ou utilisez 'Object.getClass' si vous le voulez vraiment). –

+0

D'accord avec Tom, vous ne voudrez peut-être pas écrire equals() de telle sorte qu'il est possible qu'une sous-classe de Car soit égale à une instance de Car, car cela signifie que votre equals() ne serait pas symétrique –

16

Apache Commons Lang a une classe EqualsBuilder qui fait exactement cela (voir les reflectionEquals() méthodes)

public boolean equals(Object obj) { 
    return EqualsBuilder.reflectionEquals(this, obj); 
} 

EqualsBuilder fournit également des méthodes plus explicites pour la comparaison null-sécurité des champs spécifiques, ce qui rend l'écriture " "correct" (c'est-à-dire non-réfléchissant) équivaut à des méthodes un peu moins onéreuses.

+0

Si vous êtes intéressé par la performance de l'approche par réflexion, vous pouvez jeter un oeil ici: http://blog.xebia.com/2009/04/24/declarative-equality-for-your-business-domain-objects/ – p3t0r

2

La plupart des IDE modernes ont des générateurs pour les hash-codes et égaux qui vous permettent de sélectionner les propriétés à prendre en compte. Ceux-ci battent la performance de leurs homologues réfléchissants facilement.

0

L'idée est intéressante, mais s'il vous plaît soyez conscient que la réflexion peut être lente. Si vous devez faire beaucoup de comparaisons, ou si vous placez vos objets dans des classes de collection qui effectuent des comparaisons (par exemple HashMap, HashSet etc.), la comparaison d'objets par réflexion peut devenir un goulot d'étranglement au niveau des performances.

Questions connexes