2011-10-05 31 views
5

Esta es mi implementación de la clase equals para una clase Coor que solo contiene 2 entradas xey. ¿Esta sería la forma correcta de implementar este método?Implementando el método equals en java

public boolean equals(Object obj) { 
     if (obj == null || obj.getClass() != this.getClass()) { 
      return false; 
     } 
     Coor temp = (Coor) obj; 
     if (temp.x == this.x && temp.y == this.y) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
+2

Sí. Si todos los campos son iguales, y esto es lo que quiere decir con "iguales", entonces ha hecho el método correctamente. Esto no funcionará si comparas algo que hereda de la clase actual ('this'), pero funcionará si lo están. – bdares

+1

no olvide sobrescribir la función de código hash si desea utilizarla en Colecciones (incluso si está detrás de las pantallas) –

Respuesta

7

Se podría añadir una comprobación más por la igualdad reflexiva (igual a uno mismo):

public boolean equals(Object obj) { 

    // Reflexive equality: did I get passed myself? 
    if(this == obj){ 
     return true; 
    } 

    if (obj == null || obj.getClass() != this.getClass()) { 
     return false; 
    } 

    Coor temp = (Coor) obj; 
    return temp.x == this.x && temp.y == this.y; 
} 
+0

podría explicar qué es lo que "this == obj" está realmente comparando ?, ¿está simplemente comprobando si es el mismo objeto? – user979490

+1

Ubicación de la memoria de los objetos. –

+1

Está comprobando las 2 referencias de objeto ('this' y' obj') para ver si apuntan a la misma ubicación de memoria. Si lo hacen, son el mismo objeto. – Pat

5

Sí, lo haría.

También asegúrese de anular su método hashCode() - nunca anule uno sin el otro también, confundirá al máximo sus colecciones.

Su caso podría utilizar un hash donde se limita a desplazar uno de los enteros de 32 bits y lo añade a la otra creando un largo completamente único (una función hash perfecta en este caso - no hay colisiones)

+0

voy a tener que leer sobre eso porque no tengo idea de qué es haseCode() o qué lo hace, pero gracias por la sugerencia – user979490

3

Parece OK . Por el amor brevedad, que puede hacer:

return temp.x == this.x && temp.y == this.y 

En lugar de

if (temp.x == this.x && temp.y == this.y) { 
     return true; 
    } else { 
     return false; 
    } 

También, por favor, tenga en cuenta el Contrato de objetos (en serio!).

Véase la respuesta aceptada aquí: What issues should be considered when overriding equals and hashCode in Java?

Esto le puede ahorrar una enorme acerca del dolor de cabeza en el futuro.

1

mira esto:

http://www.javapractices.com/topic/TopicAction.do?Id=17

Si ese artículo es demasiado detalle, a continuación, el corto de esto es: Su implementación es correcta, pero debe tener algunas otras cosas en mente:

  1. También deberá implementar hashCode.

  2. equals ya no commpare la identidad del objeto. No parece que eso sea un problema para ti.

  3. Puede agregar la anotación @Override a su método equals.

0

Aquí está una manera más directa:

public boolean equals(Object other) { 
    return other instanceof Coor 
     && ((Coor) other).x == x 
     && ((Coor) other).y == y 
} 
0

creo que esto funcionaría, de un vistazo rápido. Lo digo porque:

  1. Maneja bien un tipo nulo/incorrecto.
  2. La ejecución de x.equals (y) arrojaría el mismo resultado que y.equals (x).
  3. La ejecución de x.equals (x) sería verdadera.
  4. Ejecutando x.equals (y) == verdadero y y.equals (z) == verdadero implica que x.es igual a (z) == verdadero

Sin embargo, esta pregunta se ha formulado muchas veces con anterioridad. Vea aquí: Overriding equals and hashCode in Java. Un libro llamado Effective Java discute este tema en gran detalle también, y el capítulo en particular está vinculado desde allí.

0

Sólo hay una fuente para leer sobre cómo sobrescribir equals y hashCode: chapter 3 de "Effective Java" de Joshua Bloch.

Si tiene un buen IDE, como IntelliJ, generará iguales y hashCode de la manera correcta para usted.

Cuestiones relacionadas