Java getClass или instanceof для equals

Что лучше использовать для сравнения типов классов у переменных при написании equals? Я уже описывал этот метод в специальной статье. С одной стороны, я часто видел использование instanceof:

На первый взгляд, здесь всё впорядке. Но давайте создадим дочерний класс:

Вроде тоже ничего плохого. Но давайте проведём следующий эксперимент:

Результат будет такой:

Но в договорённости о работе equals в официальном JavaDoc сказано, что метод должен быть симметричным. Симметричность означает, что для каждой пары x и y у которой x.equals(y) должно быть равно y.equals(x). Значит, наши методы некорректны. Перепишем их на getClass:

Проведём эксперимент ещё раз:

Теперь класс может быть равен другому классу только если он строго того же типа, что и второй класс. Зато выполняется правило рефлексии для equals.

Вывод: Для equals всегда нужно сравнивать типы объектов через getClass.

Все методы equals и hashCode для данной статьи были сгенерированы с помощью плагина Jenerate для Eclipse.


Поделиться:
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Один комментарий к “Java getClass или instanceof для equals”

Добавить комментарий

Ваш e-mail не будет опубликован.