Потенциальные ловушки при игнорировании некоторых полей в equals / hashCode? - PullRequest
6 голосов
/ 18 октября 2011

Если только некоторые поля объекта представляют фактическое состояние, я полагаю, что их можно игнорировать при переопределении equals и hashCode ...

Я чувствую неприятное чувство по этому поводу, и хотел спросить,

  1. Это обычная практика?
  2. Есть ли потенциальные подводные камни при таком подходе?
  3. Существует ли какая-либо документация или рекомендации по игнорированию некоторых полей в equals / hashCode?

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

Ответы [ 3 ]

3 голосов
/ 18 октября 2011

Это основано на том, как вы будете учитывать уникальность данного объекта.Если у него есть первичный ключ (уникальный ключ), то достаточно использовать только этот атрибут.

Если вы считаете, что уникальность представляет собой комбинацию из 10 различных атрибутов, то используйте все 10 атрибутов в равных.

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

Выбор атрибута (ов) для равных и хеш-кода - это способ определения уникальности данногообъект.

  • Это обычная практика?Да

  • Есть ли потенциальные ловушки при таком подходе?Нет

  • Есть ли какая-либо документация или рекомендации по игнорированию некоторых полей в equals / hashCode?

    "Метод equals для класса Object реализует наиболееразличение возможных отношений эквивалентности на объектах; "

Это из класса объектов Javadoc.Но, как автор класса, вы знаете, как определяется уникальность.

2 голосов
/ 18 октября 2011

В конечном счете, «равно» означает то, что вы хотите, чтобы это значило. Существует ограничение, что «равные» значения должны возвращать один и тот же хеш-код, и, конечно, если они представлены с двумя одинаковыми адресами, «равно» должны возвращать истину. Но вы могли бы, например, иметь «равно», которое сравнивало бы содержимое двух веб-страниц (игнорируя проблему повторяемости для одноразового номера), и, даже если URL-адреса были разными, говорилось «равно», если содержимое страницы совпадало в некоторых способ.

0 голосов
/ 18 октября 2011

Лучшая документация / рекомендации, которые я видел для переопределения методов на Object, была в Effective Java Джоша Блоха.В ней есть целая глава «Методы, общие для всех объектов», в которую входят разделы «Соблюдайте общий контракт при переопределении равных» и «Всегда переопределять hashCode при переопределении равных».В нем подробно описаны вещи, которые следует учитывать при переопределении этих двух методов.Я не буду давать ответ прямо;книга определенно стоит затрат для каждого разработчика Java.

...