2010-02-23 15 views
6

¿Cómo anulo el método equals en la clase de objeto?Anulación de Java Método Object equals()

es decir tengo

class Person{ 

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

} 

Quiero cambiar el parámetro obj a una persona tipo, pero si lo hago (persona) obj no va a funcionar.

+1

Nota que hay que tener cuidado si usted tiene una clase no final. Por lo general, debe verificar la clase de tiempo de ejecución con 'obj.getClass() == Person' en lugar de' instanceof Person'. Aunque es posible escribir un contrato que haga que los tipos derivados sean iguales (como 'java.util.List'). También debe anular 'hashCode' si anula' igual', pero eso probablemente avance un poco. –

Respuesta

8

Usted puede echarlo dentro del método, sólo asegúrese de que es del tipo correcto usando instancia de

if(obj instanceof Person) 
{ 
    Person otherPerson = (Person) obj; 
    //Rest of the code to check equality 
} 
else 
{ 
//return false maybe 
} 
+0

Y pensé en la persona otherPerson = (Person) obj; Gracias – user69514

10

En realidad es más complicada de lo que parece. Haga que Eclipse (o el IDE que esté utilizando) genere automáticamente un método equals; verá que contiene algunos controles y conversiones antes de hacer una comparación.

también ver aquí: http://www.javapractices.com/topic/TopicAction.do?Id=17

8
@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; 
} 
+3

Montones No me gusta ese código, pero me veo forzado a hacer +1 por '@ Override'. –

5

Tome un vistazo a Regarding Object Comparison.

en cuenta que si se reemplaza equals() que debe también anular hashCode(). El contrato equals/hashCode es que si dos objetos son iguales deben tener el mismo código hash.

3

Si va a crear subclases de persona, usar algo como

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

en lugar de instanceof

+0

¿Por qué uno usaría getClass() en lugar de instanceof? (Solo curiosidad) – Tom

+2

p. si el empleado extiende a la persona; y el empleado tiene campos adicionales como id. Puede obtener un falso positivo usando person.equals (empleado) – saugata

+1

No se trata tanto de los falsos positivos de los que debe preocuparse, sino de la ** violación de la reflexividad **. Independientemente de lo que use, básicamente puede garantizar que 'new Employee(). Equals (new Person())' va a ser falso (Person no es una instancia de Employee). El resultado ** debe ** ser el mismo si invierte los argumentos, por lo que una Persona ** no puede ** ser igual a una subclase de sí mismo (a menos que haga algo muy funky en la subclase '' método equals() '). –

2

La única razón para usar getClass() en lugar de instanceof es si uno quisiera afirmar que ambas referencias que se comparan apuntan a objetos de la misma clase exacta en lugar de objetos que implementan la misma clase base.

Digamos que tenemos un Employeee y una Managerm (se extiende Employee).

m instanceof Employee daría verdadero, m.getClass() == Employee.class devolvería falso.

En algunos casos, este último podría ser el preferido, pero rara vez en el caso de la comparación de instancias en los métodos equals() o hashCode().

0

Un punto más puede ser bueno saber que después se reemplaza equals() método (y también hashcode()) método que pueda para comparar dos objetos de la misma clase como sigue:

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 --- 

} 
0

Sé que esto es contestada, pero en mis viajes he encontrado esto de la manera más eficiente para anular la comparación de un objeto para asegurarse de que suceda lo mismo en todo el mundo:

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

o si no está compar cuerdas ing:

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

prefiero la más simple, segura nulo (r) Objects.equals para cualquier tipo de campo:

@Override 
public boolean equals(Object o) { 
    if (o instanceof Person) { 
     Person p = (Person) o; 
     return Objects.equals(p.FIELD, this.FIELD); 
    } 
    return false; 
} 
Cuestiones relacionadas