Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > equals() и наследование


Автор: Ares4322 7.2.2013, 13:07
Доброго времени суток!
Такая проблема. 
Есть иерархия классов-сущностей. То есть основное их назначение - хранить состояние.
Необходимо реализовать для них equals() и hashCode().
Вопрос: при реализации equals() для дочерних классов из этой иерархии, нужно ли вызывать equals родительского класса?

Автор: LSD 7.2.2013, 13:36
Сильно зависит от того, как должны сравниваться наследники. Пусть B наследуется от A. Могут ли быть ситуации в которых B.equals(A) и A.equals(B)?

Автор: Ares4322 7.2.2013, 14:45
Вопрос не в этом.
Класс Parent
Код

public class Parent {
   public int digit;
   public String str;

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Parent other = (Parent) obj;
        if (this.digit != other.digit) {
            return false;
        }
        if (this.str.equals (other.str)) {
            return false;
        }
        return true;
    }
}

Класс Child
Код

public class Child extends{
   public float number;

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Child other = (Child) obj;
//нужно ли тут вызывать super.equals() ?
        if (this.number != other.number) {
            return false;
        }
        return true;
    }
}

Автор: LSD 7.2.2013, 15:11
Цитата(Ares4322 @  7.2.2013,  15:45 Найти цитируемый пост)
Вопрос не в этом.

Именно в этом! Если B.equals(A) и A.equals(B) всегда false, то стоит вызывать (это самый простой способ проверить все поля базового класса). Иначе - нет.

Автор: powerOn 7.2.2013, 16:44
Рекомендую для написания equals и hashCode использовать commons-lang: http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/builder/EqualsBuilder.html


Автор: Ares4322 7.2.2013, 17:52
Спасибо, все понял.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)