Почему ломбок добавляет метод canEqual? - PullRequest
3 голосов
/ 07 октября 2019

При использовании lombok @ Data (который добавляет EqualsAndHashCode )

Добавляет canEqual метод

protected boolean canEqual(Object other) {
  return other instanceof Exercise;
}

, который вызывается только один раз:

if (!other.canEqual((Object)this)) return false;

Я ищу и нашел обсуждения об уровне доступа

Если вы реализуете равнои hashCode в нефинальном классе самое безопасное, что мы можем сделать, это добавить can, равный тому, что мы делаем. Поскольку мы не добавляем никаких полей, затраты, особенно если метод защищен, невелики.

Но зачем нам этот сгенерированный метод? это не может быть встроенным?

1 Ответ

3 голосов
/ 07 октября 2019

Метод canEqual определен в статье под названием Как написать метод равенства в Java . Этот метод предназначен для того, чтобы позволить переопределить равенство на нескольких уровнях иерархии классов при сохранении его контракта:

Идея состоит в том, что, как только класс переопределит equalshashCode) следует также явно указать, что объекты этого класса никогда не равны объектам некоторого суперкласса, которые реализуют другой метод равенства. Это достигается путем добавления метода canEqual к каждому классу, который переопределяет equals.


Похоже, он был введен в Lombok 0.10, как описано в @EqualsAndHashCode документация:

NEW в Lombok 0.10: Если ваш класс не final и не расширяется java.lang.Object, lombok генерирует метод canEqual, который означает, что прокси JPA могутвсе еще быть равным их базовому классу, но подклассы, которые добавляют новое состояние, не нарушают контракт равных.

И документация идет немного дальше, ссылаясь на цитируемую выше статью:

Сложные причины, по которым такой метод необходим, объясняются в этой статье: Как написать метод равенства в Java . Если все классы в иерархии представляют собой комбинацию классов и классов scala и сгенерированных ломбоком методов equals, все равенство будет «просто работать». Если вам нужно написать свои собственные equals методы, вы всегда должны переопределять canEqual, если вы изменяете equals и hashCode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...