Просто хотел добавить комментарий к предыдущим ответам.В контракте equals
упоминается, что он должен быть симметричным.Это означает, что a.equals(b)
если b.equals(a)
.
Это причина, по которой instanceof
обычно не используется в equals
(если класс не является окончательным).Действительно, если некоторый подкласс Book
(например, ComicsBook
) переопределяет equals
, чтобы проверить, что другой объект также является экземпляром ComicsBook
, вы окажетесь в ситуации, когда экземпляр Book
равенэкземпляру ComicsBook
, но экземпляр ComicsBook
не равен экземпляру Book
.
Таким образом, вы должны (за исключением случаев, когда класс является окончательным или в некоторых других редких случаях) скорее сравнивать классы двух объектов:
if (this.getClass() != o.getClass()) {
return false;
}
Кстати, именно так Eclipse делает, когда генерируетhashCode
и equals
методы.