Показаны сообщения с ярлыком equals. Показать все сообщения
Показаны сообщения с ярлыком equals. Показать все сообщения

воскресенье, 28 июня 2015 г.

Контракты для equals

Как известно, метод equals() определен в классе Object. Его реализация в данном классе, это простое сравнение ссылок, и если ссылки разные, то метод возвращает false. Если Вы хотите переопределить данный метод, не стоит забывать о контракте с методом hashCode(). Он гласит - если equals() возвращает true, то значение hashCode() для этих объектов будет одинаковое, но выполнение обратного необязательно.
Есть еще один контракт, о котором стоит помнить при написании своего собственного метода equals(). Все ниже перечисленные переменные не null.
  • Он должен быть рефлексивный, т.е. для любых значений x, x.equals(x) должен возвращать всегда true
  • Метод должен быть симметричен: для любых значений x и y, если x.equals(y) == true должно выполняться y.equals(x) == true
  • Должно выполняться условие транзитивности: если x.equals(y) == true и y.equals(z) == true, то x.equals(z) == true
  • Консистентность - это значит, что метод будет возвращать одно и тоже значение, независимо от того, сколько раз его вызвали, до тех пор, пока состояние объектов, для которых он вызывается, не изменено.
  • И последнее, для всех null значений метод должен возвращать false - x.equals(null) = false

Ссылка на оригинал
Пейте кофе, пишите на java ;)