2012-06-13 11 views
21

La interfaz del Comparador tiene su propio método equals(). Cualquier clase obtendrá equals() de forma predeterminada a través de la clase de objeto. ¿Cuál es la necesidad de tener el método equals() dentro de una interfaz?¿Por qué el comparador declara iguales?

+0

A veces la explicación es bastante simple: el método igual en Comparator no estaba bien pensado. No hay una razón más profunda para eso. Cualquier razonamiento puede poner en duda por qué miles de otras clases no "redefinen" el contrato igual. – hawk

Respuesta

3

Desde el Java documentations, la razón por la Comparator tiene su propio equals() método:

Sin embargo, anulando este método puede, en algunos casos, mejorar el rendimiento permitiendo que los programas determinan que dos comparadores distintos imponen la la misma orden.

+4

Sí, pero aún es redundante mencionar el método en la interfaz. – aioobe

+0

@aioobe, su respuesta aclara todas las demás situaciones. Solo quería decirle al OP que la razón por la que está allí en la interfaz es insinuar al programador acerca de la mejora del rendimiento anulando dicho método. –

2

Léase su javadoc. Está allí solo para explicar qué debe devolver equals() si elige anularlo en una clase que implementa Comparator. Puede pensar que ningún comparador puede ser igual a cualquier otro, pero no es el caso. Puede pensar que dos comparadores son iguales si devuelven lo mismo para cualquier argumento, pero no es el caso. El javadoc explica que dos comparadores son iguales si imponen el mismo orden, sean cuales sean los argumentos dados. El javadoc también dice:

en cuenta que es siempre seguro de no anular Object.equals (Objeto)

mayoría de las veces, no se sobreescribe en equals() comparadores.

0

se proporciona el procedimiento equals() en Comparator para obligar a un usuario que implementa la interfaz Comparator para implementar equals() con algunas reglas y restricciones adicionales, además de los ya aplicados en equals() de Object.

El ser regla adicional:

Este método debe obedecer el contrato general de Object.equals (Object). Además, este método puede devolver verdadero solo si el objeto especificado también es un comparador e impone el mismo orden que este comparador. Por lo tanto, comp1.equals (comp2) implica que sgn (comp1.compare (o1, o2)) == sgn (comp2.compare (o1, o2)) para cada referencia objeto o1 y o2.

1

del docs:

no siempre es segura para anular Object.equals (Objeto). Sin embargo, anulando este método puede, en algunos casos, mejorar el rendimiento al permitir que los programas determinen que dos comparadores distintos imponen el mismo orden.

+1

Correcto, pero creo que la pregunta fue por qué este método se menciona en la interfaz, ya que semánticamente es redundante. – aioobe

7

Comparator refina el contrato de Object.equals: Tiene que satisfacer las restricciones establecidas por Object.equals y algo más.

Además, este método puede devolver verdadero solo si el objeto especificado también es un comparador e impone el mismo orden que este comparador. Por lo tanto, comp1.equals(comp2) implica que sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) para cada referencia de objeto o1 y o2.

Declarar un equals dentro Comparator le permite documentar esto en la forma de Javadoc.

Tenga en cuenta que la documentación de la API también sirve como contrato, por lo que no se trata solo de cosméticos aquí. Son restricciones explícitas en las que pueden confiar otros códigos y códigos.

En situaciones similares en las que tiene métodos menos establecidos, también puede servir para documentar un intento. Es decir, Interface.method debería estar allí, independientemente de cómo evolucionen sus súper interfaces.

+3

No estoy de acuerdo.El objetivo del método es refinar el método del contrato de iguales para los Comparadores: cuándo puede el Comparador considerarse igual y cuándo no. Puede pensar que ningún comparador puede ser igual a cualquier otro, pero no es el caso. Puede pensar que dos comparadores son iguales si devuelven lo mismo para cualquier argumento, pero no es el caso. El javadoc explícitamente dice que no es necesario anular iguales, porque 'Object.equals()' satisface el contrato. –

+1

Esa es una observación válida. Sin embargo, al final, ¿cuál es el contrato de un método API? Su documentación. Así que al final, eso es más o menos lo que estoy diciendo, aunque no tan claro como lo has expresado ;-) Reformulando ligeramente. – aioobe

+2

Prefiero su respuesta ahora, pero todavía no veo el sentido del párrafo sobre el "desacoplamiento" de la clase Object. El comparador * no * necesita este método. –

1

Poner un método de objeto en una declaración de interfaz permite que la declaración Javadoc del significado igual sea obligatoria en las clases que implementan la interfaz.

+0

Como tenemos implementación predeterminada en Object, el compilador no obliga a los programadores a implementar iguales incluso si se presenta en la interfaz. Pero compare() no está definido en el objeto, es por eso que los programadores tienen que implementarlo. – Denys

0
Comparator interface have their own equals() method 

Bueno ,. En primer lugar, debe quedar claro que siempre que implemente una interfaz Comparable, debe proporcionarle a su programa que decida cuándo los objetos son iguales, menores o mayores.

I am quite confuse about have equals() inside Comparator. Any class will get equals() by default through Object class. 

La implementación del método equals() u heredan de la clase de objeto sólo comprueba si los dos referances apuntan al mismo objeto o no. No aplica ninguna comparación. Es usted quien proporcionará en su clase (o posiblemente en su Interfaz) los criterios para que los objetos sean iguales.

Then what is need to have equals() method inside an interface? 

Obviamente, cada vez que se implementa cuando los objetos son menos, mayor que debe implementar cuando son iguales. así que en lugar de depender del objeto predeterminada método equals() que debe proporcionar a su lógica para comprobar la igualdad

1

Técnicamente, la declaración del método es redundante (el compilador no le importa), pero ...

anuncio lo El método equals en esta interfaz lo hace parte del contrato entre el que llama y los diferentes Comparadores y le permite especificar/extender su semántica.

Especifica que dos Comparadores son iguales solo si imponen el mismo orden con su método compare(). Esta amplía la semántica de Object.equals() y, por lo tanto, debe documentarse en la interfaz.

Cuestiones relacionadas