циклический equals () приводит к стекопотоку - PullRequest
3 голосов
/ 13 февраля 2012

Я использую спящий режим и имею двунаправленные отношения.Как правильно переопределить equals () для обоих классов.

Вот код (с использованием объектов guava): (PS: это плохой пример и выбор сущностей, но я заинтересован в изучении рекомендуемыхспособ это сделать)

Назначение :

@Entity
@Table(name = "DESTINATION")
public class Destination{
    private Integer id;
    private String name;
    private Set<DestinationAlias> aliases = new HashSet<DestinationAlias>(0);


    @Override
    public boolean equals(Object obj) {
        if(obj == this) return true;

        if(obj instanceof Destination){
            final Destination otherDestination = (Destination) obj;
            return Objects.equal(getName().toUpperCase(), otherDestination.getName().toUpperCase()) 
                    && Objects.equal(getAliases(), otherDestination.getAliases());
        }
        return false;
    }
}

DestinationAlias ​​:

@Entity
@Table(name = "DESTINATIONALIAS")
public final class DestinationAlias {
    private Integer idDestinationAlias;
    private String alias;   
    private Destination mainCity;

    @Override
    public boolean equals(Object obj) {
        if(obj == this) return true;

        if(obj instanceof DestinationAlias){
            final DestinationAlias otherAlias = (DestinationAlias) obj;
            return Objects.equal(getAlias().toUpperCase(), otherAlias.getAlias().toUpperCase())
                    && Objects.equal(getMainCity(), otherAlias.getMainCity());
        }
        return false;
    }
}

Это тестcase:

@Test
public void testEqualsto(){
    Destination dest = new Destination("abc", 1.0f, 1.0f);
    dest.getAliases().add(new DestinationAlias("abc alias", dest));

    Destination dest1 = new Destination("abc", 1.0f, 1.0f);
    dest1.getAliases().add(new DestinationAlias("abc alias", dest1));

    assertEquals(dest, dest1);
}

Как и ожидалось, происходит переполнение стека, поскольку каждый метод equals () по очереди вызывает другой метод equals (), и происходит цикл.

Какой рекомендуемый способ переопределить метод equals () для двунаправленных лиц.

1 Ответ

3 голосов
/ 13 февраля 2012

Мы должны отменить конфликт вручную. В DestinationAlias я бы изменил выражение equals, чтобы оно сравнивало только идентификаторы Destionation (они должны быть уникальными):

return Objects.equal(getAlias().toUpperCase(), otherAlias.getAlias().toUpperCase())
            && Objects.equal(getMainCity().getId(), otherAlias.getMainCity().getId());
                                          ^^^^^^^^                          ^^^^^^^^

Дополнительная литература

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