Проблема с реализацией equals () по умолчанию в Eclipse - PullRequest
0 голосов
/ 30 апреля 2019

У меня возникли некоторые проблемы с методом equals, сгенерированным Eclipse.

Предположим, у меня есть Entity Bean с атрибутами entityId и name, но я только что выбрал для генерации равныхатрибут entityId.Итак, код, сгенерированный eclipse, выглядит следующим образом:

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Entity other = (Entity) obj;
        if (entityId == null) {
            if (other.entityId != null)
                return false;
        } else if (!entityId.equals(other.entityId))
            return false;
        return true;
    }

Проблема заключается в том, что при сравнении двух разных экземпляров класса Entity, имеющих null в качестве entityId, метод equals возвращаетtrue.

Для меня эта реализация equals не верна (по крайней мере, при использовании ее с JPA), поскольку две сущности без entityId являются просто объектом, который (вероятно) будет сохранен какновые объекты в базе данных.Если я добавлю эти два объекта в набор (например, отношение один ко многим), после двух вставок в нем будет только один элемент (наборы не допускают дублирование).

Итак,Вопрос в том, почему Eclipse генерирует такой метод equals?Как вы думаете, лучше реализовать метод equals с помощью следующего кода?

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Entity other = (Entity) obj;
        if (entityId == null) {
            if (other.entityId != null)
                return false;
            else 
                return true;
        } else if (!entityId.equals(other.entityId))
            return false;
        return true;
    }

1 Ответ

2 голосов
/ 30 апреля 2019

Eclipse просто не знает, как вы будете использовать свой класс.

Обычно, если поля имеют одинаковые значения, объекты считаются равными

class Human {
    String name;
    String petName;
}

Human("Bob", null) равно Human("Bob", null).

Ваш случай является чем-то особенным, поэтому вы должны сделать настройку самостоятельно.

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