Первый вопрос, который я должен спросить, если вы хотите сделать «глубокие» равные на Бобе? у него есть дочерние бобы, которые нужно проверить? Вы можете переопределить метод equals, но он возвращает только логическое значение, поэтому вы можете создать «компаратор», который может выдать исключение с сообщением о том, что не равно.
В следующих примерах я перечислил несколько способов реализации метода equals.
Если вы хотите проверить, являются ли они одним и тем же экземпляром объекта, то нормальный метод equals из Object сообщит вам.
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. Это не (я не думаю) позволит вам проверить частные переменные memeber, когда тестирование двух объектов одинаково. (если ваша объектная модель имеет круговую зависимость, не делайте этого, она никогда не вернется)
ПРИМЕЧАНИЕ: это не мой код, а от ...
Отражение Java равно
public static логическое 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, когда вы найдете раздел, который не равен.