Правильно переопределить метод equals - PullRequest
4 голосов
/ 17 июня 2011

мой учитель дал мне решение по главному примеру равных, и это выглядит так:

@Override
public boolean equals(Object o)
{
    if (this == o) return true;
    boolean result = false;
    if (o instanceof Product)
    {
        Product other = (Product)o;
        result = this.id == other.id;
    }
    return result;
}

метод переопределяется для класса Product, у которого есть атрибут id, уникальный для каждого продукта. Но я не понимаю смысла первого, если, я думаю, что второй, если уже проверил ограничения первого. Может ли кто-нибудь дать мне пример работы этого кода, а этот ниже нет? Спасибо!

@Override
public boolean equals(Object o)
{
    boolean result = false;
    if (o instanceof Product)
    {
        Product other = (Product)o;
        result = this.id == other.id;
    }
    return result;
}

Ответы [ 4 ]

4 голосов
/ 17 июня 2011

Оба примера кода работают.if (this == o) return true; в первом примере - это оптимизация производительности (скорее всего, преждевременная оптимизация - всегда сначала профиль) , которая проверяет, сравнивается ли объект с самим собой.В Java оператор == сравнивает, являются ли два объекта одним и тем же экземпляром, а не являются ли они разными экземплярами с одинаковыми данными.

Возможны стили написания метода equals.Вот как я обычно это делаю:

public boolean equals(Object obj) {
    if (obj instanceof Product) {
        Product that = (Product) obj;
        return this.id == that.id;
    }
    return false;
}

Если я знаю, что мой код никогда не будет сравнивать объект с объектами других типов или с нулем, то я даже могу написать код, как показано ниже, поэтомуто, что это вызовет исключение, если это произойдет в любом случае - это будет означать, что в моем коде есть ошибка, поэтому, если он рано произойдет, я узнаю об этом и исправлю его раньше.

public boolean equals(Object obj) {
    Product that = (Product) obj;
    return this.id == that.id;
}
0 голосов
/ 17 июня 2011

В eclipse у вас есть опция «Создать hashCode () и equals () ...» (Источник меню)

0 голосов
/ 17 июня 2011
if (this == o) return true;

Вышеупомянутое утверждение является избыточным.

Более конкретно, это просто проверка, чтобы увидеть, сравниваете ли вы объект с самим собой ... чтобы он мог пропустить код под ним.Например:

Foo f = new Foo();
f.equals(f); //the if (this == o) would be true. References the same thing.

Примечание. В дополнение, если одно переопределение равно, нужно переопределить hashcode (), чтобы поддерживать общий контракт для hashcode () - равные объекты должны иметь один и тот же хэш-код (наоборотневерно, поскольку два объекта могут иметь одинаковый хэш, но не быть равными.)

http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#equals(java.lang.Object)

0 голосов
/ 17 июня 2011

Вы правы.Первый оператор if является избыточным, поскольку this == o подразумевает o instanceof Product и this.id == other.id.

Если аргумент является производительностью, я бы сказал, что он пахнет преждевременной оптимизацией.

...