Переопределение Java Метод объекта equals () - PullRequest
6 голосов
/ 23 февраля 2010

Как переопределить метод equals в классе объектов?

то есть у меня

class Person{

//need to override here
public boolean equals (Object obj){

}

Я хочу преобразовать параметр obj в тип Person, но если я сделаю (Person) obj, он не будет работать.

Ответы [ 9 ]

10 голосов
/ 23 февраля 2010

На самом деле все сложнее, чем вы думаете. Имейте Eclipse (или любую IDE, которую вы используете), автоматически генерируйте метод equals; перед сравнением вы увидите, что он содержит несколько проверок и приведений.

Также см. Здесь: http://www.javapractices.com/topic/TopicAction.do?Id=17

8 голосов
/ 23 февраля 2010
@Override
public boolean equals(Object o) 
{
    if (o instanceof Person) 
    {
      Person c = (Person) o;
      if ( this.FIELD.equals(c.FIELD) ) //whatever here
         return true;
    }
    return false;
}
7 голосов
/ 23 февраля 2010

Вы можете привести его в методе, просто убедитесь, что это правильный тип, используя экземпляр

if(obj instanceof Person)
{
   Person otherPerson = (Person) obj;
   //Rest of the code to check equality
}
else
{
//return false maybe
}
5 голосов
/ 23 февраля 2010

Взгляните на относительно сравнения объектов .

Помните, что если вы переопределяете equals(), вы должны также переопределить hashCode() Контракт equals / hashCode заключается в том, что если два объекта равны, они должны иметь одинаковый хэш-код.

3 голосов
/ 23 февраля 2010

Если вы планируете создавать подклассы Person, используйте что-то вроде

if (obj! = Null && obj.getClass () == Person.class)

, а не instanceof

2 голосов
/ 23 февраля 2010

Единственная причина для использования getClass() вместо instanceof состоит в том, что нужно утверждать, что сравниваемые ссылки указывают на объекты точно такого же класса, а не объекты, реализующие один и тот же базовый класс.

Скажем, у нас есть Employee e и Manager m (расширяется Employee).

m instanceof Employee вернул бы true, m.getClass() == Employee.class вернул бы false.

В некоторых случаях последний может быть предпочтительным, но редко в случае сравнения экземпляров в equals() или hashCode() методах.

1 голос
/ 30 января 2018

Я предпочитаю более простой, нулевой сейф (r) Objects.equals для любого типа поля:

@Override
public boolean equals(Object o) {
    if (o instanceof Person) {
        Person p = (Person) o;
        return Objects.equals(p.FIELD, this.FIELD);
    }
    return false;
}
0 голосов
/ 05 ноября 2014

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

@Override
public boolean equals(Object o) {
    return o instanceof Person && this.getSomeMagicalField().equals(((Person) o).getSomeMagicalField());
}

или , если вы не сравниваете строки:

@Override
public boolean equals(Object o) {
    return o instanceof Person && this.getSomeMagicalField() == (Person) o).getSomeMagicalField();
}
0 голосов
/ 23 февраля 2010

Еще один момент, который может быть полезен, это то, что после переопределения метода equals() (а также hashcode()) вы можете сравнивать два объекта одного класса следующим образом:

Person p1 = new Person();
Person p2 = new Person();

....

if ( p1.equals( p2 ) )

{
   // --- Two Persons are equal, w.r.t the fields you specified in equals method ---

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