Должен ли я переопределить метод Object.equals(Object)?

У меня есть два экземпляра одного класса.

public class Gilda {
    private String nome;
    public Gilda(String nome) {
        this.nome = nome;
    }
    // More stuff
}

При попытке сравнить их через Object.equals(Object) метод, он возвращает false, Это странно, потому что nome имеет одинаковое значение в обоих этих случаях.

Как работает сравнение? Это ожидаемое поведение? Должен ли я переопределить этот метод?

2 ответа

Решение

Да, вы должны переопределить это. Не делая этого, вы используете версию, которая Object Сам предоставляет, который по умолчанию ссылается на равенство (это один и тот же "физический" объект).

В зависимости от вашей IDE, это может быть написано автоматически для вас. Например, IntelliJ 14 только что написал это для меня:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Gilda gilda = (Gilda) o;
    if (nome != null ? !nome.equals(gilda.nome) : gilda.nome != null) return false;

    return true;
}        

И, конечно же, не забудьте hashCodeчто всегда должно быть сделано одновременно с equals:

@Override
public int hashCode() {
    return nome != null ? nome.hashCode() : 0;
}

Вы должны переопределить метод equals - и соответственно - вы должны переопределить hashCode с ним.

Другие вопросы по тегам