Skip to content

Commit

Permalink
Fix equals.md
Browse files Browse the repository at this point in the history
  • Loading branch information
aarexer committed Dec 6, 2024
1 parent 9055376 commit e481bd4
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions jcore/object/equals.md
Original file line number Diff line number Diff line change
Expand Up @@ -542,7 +542,7 @@ false

Так что делать и когда использовать getClass, а когда instanceOf?

Выбор `getClass` или `instanceOf` в качестве способа для проверки принадлежности класса надо делать под конкретную задачу, осознавая к чему может привести ваше решение.
Выбор `getClass` или `instanceOf` в качестве способа для проверки принадлежности класса необходимо делать под конкретную задачу, осознавая к чему может привести ваше решение.

Если ваш класс будет участвовать в наследовании, то рассмтаривать надо вариант с `instanceOf`, так как `getClass` может привести к крайне неприятному поведению в `HashMap`-ах и прочих `hash`-структурах:

Expand All @@ -555,9 +555,6 @@ false
> In Java, it's particularly important because most of the collections (HashTable, etc.) are based on the equals method.
> If you put a member of the super class in a hash table as the key and then look it up using a subclass instance, you won't find it, because they are not equal.
В противном случае лучше выбирать `getClass`.

Но в некоторых случаях, `instanceOf` вполне можно использовать и не переживать о нарушениях.
Например, посмотрите как определен `equals` у `HashSet`:

```java
Expand Down Expand Up @@ -599,6 +596,10 @@ false

Здесь использован `instanceOf`, так как если все элементы одного множества содержатся в другом, то множества считаются равными, независимо от того, что это за множества: `HashSet` или `TreeSet`.

С другой стороны, неаккуратное использование `instanceOf` может привести к проблемам с симметричностью.

Поэтому для ответа на вопрос 'Что использовать?' необходмио понимать как и где вы будете использовать ваш класс.

А лучше вообще отказаться от наследования в пользу композиции.

Гораздо более правильнее было бы поступить так, что объявить класс в виде:
Expand Down Expand Up @@ -763,6 +764,8 @@ false
Для сравнения объектов по значению необходимо переопределять метод `equals`, при этом выполняя требования к методу: рефлексивности, симметричности, транзитивности и согласованности.

* Помните о разнице `instanceOf` и `getClass`, а также о подводных камнях при выборе того или иного способа проверки.
* Учитывайте в сравнении только значимые поля
* После определения проверьте соответствие контракту и требованиям
* При работе с `float` и `double` помните о том, что существуют `NaN`, поэтому для сравнения таких типов используйте специальные методы `Float.compare` и `Double.compare`.
* Для простых полей, кроме `double` и `float` используйте обычное сравнение через `==`.
* Не забывайте, что очередность сравнения влияет на производительность, поэтому сначала сравниваем поля, которые чаще других могут быть различны.
Expand Down

0 comments on commit e481bd4

Please sign in to comment.