2011-08-07 5 views
23

Si implemento java.lang.Comparable para una clase, ¿todavía tengo que anular el método equals()? ¿O también funcionará el Comparable para equals?java.lang.Comparable e iguala

Si la respuesta es no, ¿qué pasa si surge alguna discrepancia? Digamos que la forma en que denomino dos objetos como iguales dentro del método equals() es diferente de la forma en que denomino dos objetos de la misma clase como iguales dentro del compareTo() del Comparable.

Además, si implemento Comparable, ¿también tengo que anular equals()?

Respuesta

26

Si bien se recomienda (y bastante sensible) que tener a.compareTo(b) == 0 implica que a.equals(b) (y viceversa), es no es necesario. Comparable está destinado a ser utilizado al realizar un pedido en una serie de objetos, mientras que equals() solo prueba la igualdad directa.

This link tiene buena información sobre la implementación correcta de compareTo.

+0

+1 Aquí hay un enlace a los capítulos correspondientes de Java eficaz (véase el punto 11) http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf – MByD

+0

@MByD Gracias por el enlace. ¡(Como era de esperar) lo dice mejor que yo! – dlev

+0

@MbyD gracias por el enlace. ¿Está bien para llamar a.comparar a (b) o comparar() directamente? – aps

7

De Javadoc de java.lang.Comparable:

es muy recomendable (aunque no es obligatorio) que ordenaciones naturales sean consistentes con los iguales.

0

Digamos que la forma en que denomino dos objetos como iguales dentro de los iguales() método es diferente de la forma en que denomino dos objetos de la misma clase como igual dentro del toCompare() del Comparable?

Si hace esto, y poner esos objetos en un ordenan establecer, el conjunto se comportará mal. From the docs on SortedSet:

Tenga en cuenta que el orden mantenido por un conjunto ordenado (si no se proporciona una comparador explícito) debe ser consistente con los iguales si el conjunto ordenado es implementar correctamente la interfaz Set.

Por ejemplo, un TreeSet puede (erróneamente) contienen dos objetos donde

a.compareTo(b) != 0 

a pesar de que

a.equals(b) == true 
+1

Todas las operaciones 'TreeSet' se realizan usando' compareTo' - de modo que los objetos que la comparación devuelve '! = 0' se consideran distintos, y los objetos que la comparación devuelve' == 0' son idénticos (y por lo tanto solo el primero agregado a el conjunto se retiene en realidad). Como dice el Javadoc: 'El comportamiento de un conjunto ordenado está bien definido, incluso si su orden es inconsistente con los iguales; simplemente no obedece el contrato general de la interfaz de Set. –