2017-01-06 2 views
-1

Я понимаю контракт между hashcode() и equals(). Я не понимаю, что я должен включать все поля моего класса (bean) при вычислении того же самого? например Мне нужно использовать мой объект bean в коллекции на основе hash и требует сортировки. Класс bean содержит ~ 25 полей.Должен ли я рассматривать все поля при вычислении переопределения hashcode() и equals()?

Нужно ли рассматривать все свое поле, переопределяя HashCode() и euqals()?

+4

No. только те поля, которые необходимы для определения «идентичности» (для хэша-коды) - и что касается равных, это зависит от вас. По умолчанию Object # equals проверяет только ссылочное равенство. –

+0

@ Elliot Как я понимаю, наилучшей практикой является использование тех же полей в hashcode() и equals(). – Diganta

+1

Вы понимаете разницу между * абсолютно необходимой и лучшей практикой? Что вы спрашиваете здесь? –

ответ

1

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

Я даже видел в одном из проектов, используя только поле «id» (уникальное от объекта к объекту) для вычисления hashcode.

Edit: понравился предложение от Димитрия в разделе комментариев, если в случае, если вы хотите, чтобы удалить поля пробуют: https://projectlombok.org/features/EqualsAndHashCode.html выглядит чище

0

Вы не должны переопределять методы equals или hashCode, если это абсолютно необходимо.

Если вам нужно это сделать, попробуйте использовать только те поля, которые делают ваши объекты «уникальными» среди них.

Для того, чтобы отсортировать объекты, вы можете взглянуть на интерфейсы Comparator or Comparable, которые вы можете использовать для сравнения объектов с заданным полем или набором полей.

Смежные вопросы