Должны ли мы всегда переопределять равные? - PullRequest
13 голосов
/ 11 октября 2009

При написании собственных классов всегда необходимо переопределять equals(Object o)?

Если я этого не сделаю, будет ли он автоматически проверять, все ли поля одинаковы? Или он просто проверяет, указывают ли две переменные на один и тот же объект?

Ответы [ 4 ]

16 голосов
/ 11 октября 2009

Если вы пишете класс, который будет каким-либо образом сравнивать свои объекты, тогда следует переопределить методы equals и hashCode.

Отсутствие явного метода equals приведет к наследованию поведения метода equals от суперкласса, а в случае суперкласса, являющегося классом Object, это будет поведение, установленное в Спецификация Java API для класса Object.

Общий контракт на предоставление метода equals можно найти в документации по классу Object, в частности, документации по equals и hashCode методы.

5 голосов
/ 11 октября 2009

Переопределять equals(), только если это имеет смысл. Но очевидно, что если вы переопределяете equals(), вам нужно убедиться, что контракт hashcode() не нарушен, то есть, если два объекта равны, они должны иметь одинаковый хэш-код.

Когда это имеет смысл? Когда Object.equals() недостаточно. Этот метод в основном сводится к ссылочной идентичности, то есть два объекта - это один и тот же объект, поэтому:

a.equals(b) iff q == b

Числа являются очевидным примером, когда это имеет смысл, потому что Integer(10) должен равняться другому Intger(10).

Другим примером может быть ситуация, когда вы представляете записи базы данных. Допустим, у вас есть записи Стьюдента с уникальным целочисленным идентификатором, тогда может быть достаточной реализацией equals для простого сравнения полей идентификатора.

4 голосов
/ 11 октября 2009

Метод equals для класса Object реализует максимально различающее возможное отношение эквивалентности для объектов; то есть для любых ненулевых ссылочных значений x и y этот метод возвращает true тогда и только тогда, когда x и y ссылаются на один и тот же объект (x == y имеет значение true).

Чтобы проверить, равны ли два объекта в смысле эквивалентности (содержащие одинаковую информацию), вы должны переопределить метод equals (). Вы должны всегда переопределять метод equals (), если оператор тождества не подходит для вашего класса .

Обратите внимание, что обычно необходимо переопределять метод hashCode всякий раз, когда этот метод переопределяется, чтобы поддерживать общий контракт для метода hashCode, в котором говорится, что равные объекты должны иметь одинаковые хеш-коды.

2 голосов
/ 12 октября 2009

Хотя вы не должны полагаться на IDE, Eclipse предоставляет эту постоянную функциональность, нажимая alt + shift + s и выбирая опции меню equals и hashCode. Также есть опция toString. Effective Java от Josh Bloch обладает хорошей информацией по этому вопросу. Ссылка приведет вас к главе, размещенной в Google Книгах, в которой обсуждается эта тема.

...