Bah - «Вы должны переопределить hashCode () в каждом классе, который переопределяет equals ().»
[из Эффективной Явы, Джошуа Блох?]
Разве это не неправильно? Переопределение hashCode, вероятно, подразумевает, что вы пишете класс ключа хеша, но переопределение equals определенно этого не делает. Есть много классов, которые не используются в качестве хеш-ключей, но по какой-то другой причине хотят метод тестирования на логическое равенство. Если вы выберете «равно» для него, вам может быть поручено написать реализацию hashCode из-за чрезмерного усердия в применении этого правила. Все, что достигается, - это добавить непроверенный код в кодовую базу, злое ожидание, чтобы запутать кого-то в будущем. Также написание кода, который вам не нужен, является анти-проворным. Это просто неправильно (и созданный идеей, вероятно, будет несовместим с вашими созданными вручную равными).
Конечно, они должны были назначить интерфейс для объектов, написанных для использования в качестве ключей? В любом случае, Object никогда не должен был предоставлять hashCode () и equals () по умолчанию imho. Вероятно, это поощряется многими битыми коллекциями хешей.
Но в любом случае, я думаю, что "правило" написано задом наперед. А пока я буду избегать использования «равно» для методов проверки на равенство: - (