Метод canEqual
определен в статье под названием Как написать метод равенства в Java . Этот метод предназначен для того, чтобы позволить переопределить равенство на нескольких уровнях иерархии классов при сохранении его контракта:
Идея состоит в том, что, как только класс переопределит equals
(и hashCode
) следует также явно указать, что объекты этого класса никогда не равны объектам некоторого суперкласса, которые реализуют другой метод равенства. Это достигается путем добавления метода canEqual
к каждому классу, который переопределяет equals
.
Похоже, он был введен в Lombok 0.10, как описано в @EqualsAndHashCode
документация:
NEW в Lombok 0.10: Если ваш класс не final
и не расширяется java.lang.Object
, lombok генерирует метод canEqual
, который означает, что прокси JPA могутвсе еще быть равным их базовому классу, но подклассы, которые добавляют новое состояние, не нарушают контракт равных.
И документация идет немного дальше, ссылаясь на цитируемую выше статью:
Сложные причины, по которым такой метод необходим, объясняются в этой статье: Как написать метод равенства в Java . Если все классы в иерархии представляют собой комбинацию классов и классов scala и сгенерированных ломбоком методов equals, все равенство будет «просто работать». Если вам нужно написать свои собственные equals
методы, вы всегда должны переопределять canEqual
, если вы изменяете equals
и hashCode
.