Подтвердить что ты не робот

Должны ли мы всегда переопределять равные?

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

a.equals(b) iff q == b

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

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

Ответ 3

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

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

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

Ответ 4

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