我有一个对象本身有多个对象作为字段。我的问题是,我有两个这类对象,我想比较这两个。我知道我可以做equals,比较器等但有一种方法可以使用反射来获取对象的属性并进行比较。
例如,如果我有一个Car对象,它作为轮子对象,它有轮胎对象,它有螺栓对象。请记住以上所有对象都是单独的而不是嵌套的类。如何比较2个汽车对象?感谢任何帮助?
由于
答案 0 :(得分:17)
Apache Commons Lang有一个EqualsBuilder类,可以完成此操作(请参阅reflectionEquals()
方法)
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
EqualsBuilder
还为特定字段的空安全比较提供了更明确的方法,这使得编写“正确”(即非反射)等于方法的方法不那么繁重。
答案 1 :(得分: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;
}
}
是正确的方法。不建议通过反射进行自动比较。一方面,“状态”是比反映属性比较更通用的概念。
你可以写一些做深度反思比较的东西,但它有点遗漏了这一点。
答案 2 :(得分:2)
大多数现代IDE都具有hashcode和equals的生成器,可让您选择要考虑的属性。那些轻松击败反光对手的表现。
答案 3 :(得分:0)
这个想法很有意思,但请注意反思可能很慢。如果您需要进行大量比较,或者将对象放在进行比较的集合类中(例如HashMap
,HashSet
等),则通过反射比较对象可能会成为性能瓶颈。