Статьи

Личность против Равенство в Яве

Давайте кратко рассмотрим идентичность и равенство в Java, то, что они есть, и как они сравниваются друг с другом. 


Вам также может понравиться:
Идентичность объекта и равенство в Java

Ключевые вынос

  • Не включайте поля ID в ваши классы домена Java.
  • Используйте все поля в вашем equals()и hashCode()реализации.

объяснение

Я видел много Java кода , где разработчики реализовать equals()и hashCode()с точки зрения поля ID или подмножества полей, образующих составной ключ. Это делается так часто, что становится паттерном, когда, на мой взгляд, на самом деле это анти-паттерн . Чтобы понять, почему это анти-шаблон, мы должны дифференцировать идентичность от равенства:

тождественность

Когда мы говорим об идентичности в информатике, мы обычно думаем о чем-то, что однозначно идентифицирует человека или вещь. В Java мы используем ссылки для уникальной идентификации объектов. Это также называется ссылочным равенством (да, наименование сбивает с толку). Вы используете  ==для сравнения идентичности двух объектов.

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

равенство

Равенство означает, что два объекта являются одинаковыми. Два равных объекта не обязательно означают, что они являются одним и тем же объектом. В Java мы используем equals()метод, чтобы проверить, равны ли два объекта. Это также называется структурным равенством.

Равенство всегда можно решить, взглянув только на объект. Вам не нужно никакой внешней информации, чтобы решить равенство. Равенство со временем может измениться: я не равен тому, кем был 20 лет назад.

Объекты реального мира

Когда вы моделируете объекты реального мира, у вас обычно есть какой-то идентификатор для ссылки на него. Например, у вас может быть простое определение продукта с идентификатором и ценой:


Джава