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?
Respuesta
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.
Sí, pero aún es redundante mencionar el método en la interfaz. – aioobe
@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. –
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.
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.
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.
Correcto, pero creo que la pregunta fue por qué este método se menciona en la interfaz, ya que semánticamente es redundante. – aioobe
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 quesgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))
para cada referencia de objetoo1
yo2
.
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.
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. –
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
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. –
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.
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
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
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.
- 1. ¿Por qué está roto mi simple comparador?
- 2. ¿Por qué debería un Comparador implementar Serializable?
- 3. ¿Por qué no se declara NULL?
- 4. ¿Por qué el comparador de igualdad predeterminado de Knockout.js trata a los tipos no primitivos como no iguales?
- 5. ¿Por qué no es obligatorio implementar iguales en java.util.Comparator?
- 6. ¿Por qué estos números no son iguales?
- 7. ¿Por qué arr y & arr son iguales?
- 8. Nothing = String.Empty (¿Por qué son iguales?)
- 9. Java TreeMap (comparador) y obtienes el método ignorando el comparador
- 10. ¿Por qué un delegado de .NET no se declara estático?
- 11. ¿Por qué se declara este evento con un delegado anónimo?
- 12. ¿Por qué la estructura GUID se declara tal como es?
- 13. ¿Por qué la clase HttpServlet se declara como abstracta?
- 14. ¿Por qué NullPointerException no se declara como una excepción marcada?
- 15. ¿La clasificación por "comparador" no transitivo funciona?
- 16. comparador de java, ¿cómo ordenar por entero?
- 17. ¿Por qué Java no ve que los enteros son iguales?
- 18. TSQL - ALGUNOS | CUALQUIERA, ¿por qué son iguales con diferentes nombres?
- 19. ¿Por qué StringBuffer/StringBuilder no anula iguales o hashCode?
- 20. ¿Por qué no debería usar iguales con la herencia?
- 21. Clasificación mediante comparador- Orden descendente (clases definidas por el usuario)
- 22. ¿Por qué strcmp() devuelve 0 cuando sus entradas son iguales?
- 23. ¿Por qué el operador! = De Python piensa que los argumentos son iguales y no iguales al mismo tiempo?
- 24. Java Comparador
- 25. ¿Por qué se ejecuta el parámetro de botón "comando" cuando se declara?
- 26. ¿Por qué el compilador de C# declara explícitamente todas las interfaces que implementa un tipo?
- 27. ¿Por qué el compilador declara que no existe una instancia máxima única?
- 28. comparador para STL establece
- 29. Java: Comparable vs Comparador
- 30. std :: set encargo comparador
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