我要问的第一个问题是,你想在 Bean 上做“深度”等于吗?它是否有需要测试的子 bean?您可以重写 equals 方法,但这只会返回一个布尔值,因此您可以创建一个“比较器”,这可能会引发异常并显示不相等的消息。
在以下示例中,我列出了几种实现 equals 方法的方法。
如果你想检查它们是否是同一个对象实例,那么来自 Object 的普通 equals 方法会告诉你。
objectA.equals(objectB);
如果你想编写一个客户的equals方法来检查一个对象的所有成员变量是否使它们相等,那么你可以像这样覆盖equals方法......
/**
* Method to check the following...
* <br>
* <ul>
* <li>getTitle</li>
* <li>getInitials</li>
* <li>getForename</li>
* <li>getSurname</li>
* <li>getSurnamePrefix</li>
* </ul>
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj)
{
if ( (!compare(((ICustomer) obj).getTitle(), this.getTitle()))
|| (!compare(((ICustomer) obj).getInitials(), this.getInitials()))
|| (!compare(((ICustomer) obj).getForename(), this.getForename()))
|| (!compare(((ICustomer) obj).getSurname(), this.getSurname()))
|| (!compare(((ICustomer) obj).getSurnamePrefix(), this.getSurnamePrefix()))
|| (!compare(((ICustomer) obj).getSalutation(), this.getSalutation())) ){
return false;
}
return true;
}
最后一个选项是使用 java 反射检查 equals 方法中的所有成员变量。如果您真的想通过其 bean get/set 方法检查每个成员变量,这非常棒。当两个对象的测试相同时,它不会(我不认为)允许您检查私有成员变量。 (如果你的对象模型有循环依赖,不要这样做,它永远不会返回)
注意:这不是我的代码,它来自...
Java Reflection equals
公共静态布尔等于(对象 bean1,对象 bean2)
{
// 处理琐碎的情况
如果(bean1 == bean2)
返回真;
if (bean1 == null)
return false;
if (bean2 == null)
return false;
// Get the class of one of the parameters
Class clazz = bean1.getClass();
// Make sure bean1 and bean2 are the same class
if (!clazz.equals(bean2.getClass()))
{
return false;
}
// Iterate through each field looking for differences
Field[] fields = clazz.getDeclaredFields();
for (int i = 0; i < fields.length; i++)
{
// setAccessible is great (encapsulation
// purists will disagree), setting to true
// allows reflection to have access to
// private members.
fields[i].setAccessible(true);
try
{
Object value1 = fields[i].get(bean1);
Object value2 = fields[i].get(bean2);
if ((value1 == null && value2 != null) ||
(value1 != null && value2 == null))
{
return false;
}
if (value1 != null &&
value2 != null &&
!value1.equals(value2))
{
return false;
}
}
catch (IllegalArgumentException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
return true;
这并不能告诉您差异的原因,但是当您发现不相等的部分时,可以通过向 Log4J 发送消息来完成。