Должен ли я переопределить метод 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 с ним.