diff --git a/jcore/object/equals.md b/jcore/object/equals.md index 76fc631..cdcfcb5 100644 --- a/jcore/object/equals.md +++ b/jcore/object/equals.md @@ -542,7 +542,7 @@ false Так что делать и когда использовать getClass, а когда instanceOf? -Выбор `getClass` или `instanceOf` в качестве способа для проверки принадлежности класса надо делать под конкретную задачу, осознавая к чему может привести ваше решение. +Выбор `getClass` или `instanceOf` в качестве способа для проверки принадлежности класса необходимо делать под конкретную задачу, осознавая к чему может привести ваше решение. Если ваш класс будет участвовать в наследовании, то рассмтаривать надо вариант с `instanceOf`, так как `getClass` может привести к крайне неприятному поведению в `HashMap`-ах и прочих `hash`-структурах: @@ -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 @@ -599,6 +596,10 @@ false Здесь использован `instanceOf`, так как если все элементы одного множества содержатся в другом, то множества считаются равными, независимо от того, что это за множества: `HashSet` или `TreeSet`. +С другой стороны, неаккуратное использование `instanceOf` может привести к проблемам с симметричностью. + +Поэтому для ответа на вопрос 'Что использовать?' необходмио понимать как и где вы будете использовать ваш класс. + А лучше вообще отказаться от наследования в пользу композиции. Гораздо более правильнее было бы поступить так, что объявить класс в виде: @@ -763,6 +764,8 @@ false Для сравнения объектов по значению необходимо переопределять метод `equals`, при этом выполняя требования к методу: рефлексивности, симметричности, транзитивности и согласованности. * Помните о разнице `instanceOf` и `getClass`, а также о подводных камнях при выборе того или иного способа проверки. +* Учитывайте в сравнении только значимые поля +* После определения проверьте соответствие контракту и требованиям * При работе с `float` и `double` помните о том, что существуют `NaN`, поэтому для сравнения таких типов используйте специальные методы `Float.compare` и `Double.compare`. * Для простых полей, кроме `double` и `float` используйте обычное сравнение через `==`. * Не забывайте, что очередность сравнения влияет на производительность, поэтому сначала сравниваем поля, которые чаще других могут быть различны.