Pourquoi Comparator déclare-t-il égal?

L’interface de comparateur a sa propre méthode equals() . Toute classe obtiendra equals() par défaut via la classe Object. Quel est le besoin d’avoir la méthode equals() dans une interface?

Comparator affine le contrat de Object.equals : il doit satisfaire aux contraintes définies par Object.equals , puis certaines .

En outre, cette méthode ne peut renvoyer la valeur true que si l’object spécifié est également un comparateur et impose le même ordre que ce comparateur. Ainsi, comp1.equals(comp2) implique que sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) pour chaque référence d’object o1 et o2 .

Déclarer un equals intérieur de Comparator vous permet de documenter cela sous la forme de javadoc.

Notez que la documentation de l’API sert également de contrat, il n’y a donc pas que des produits cosmétiques. Ce sont d’autres contraintes et votre code peuvent compter sur des contraintes explicites.

Dans des situations similaires où vous avez des méthodes moins établies, cela peut également servir à documenter une intention. Par exemple, Interface.method devrait être là, quelle que soit l’évolution de ses super interfaces.

Parmi les documentations Java, la raison pour laquelle Comparator a sa propre méthode equals() :

Toutefois, cette méthode peut, dans certains cas, améliorer les performances en permettant aux programmes de déterminer que deux comparateurs distincts imposent le même ordre.

Lire son javadoc . Il n’y a là que pour expliquer ce que equals() doit retourner si vous choisissez de le remplacer dans une classe implémentant Comparator. Vous pourriez penser qu’aucun comparateur ne peut être égal à un autre, mais ce n’est pas le cas. Vous pourriez penser que deux comparateurs sont égaux s’ils renvoient la même chose pour n’importe quel argument, mais ce n’est pas le cas. Le javadoc explique que deux comparateurs sont égaux s’ils imposent le même ordre, quels que soient les arguments donnés. Le javadoc dit aussi:

Notez qu’il est toujours prudent de ne pas remplacer Object.equals (Object)

La plupart du temps, vous ne substituez pas equals() dans les comparateurs.

des docs :

il est toujours prudent de ne pas remplacer Object.equals (Object). Toutefois, cette méthode peut, dans certains cas, améliorer les performances en permettant aux programmes de déterminer que deux comparateurs distincts imposent le même ordre .

Techniquement, la déclaration de la méthode est redondante (le compilateur s’en moque), mais …

Déclarer la méthode equals dans cette interface en fait une partie du contrat entre l’appelant et différents comparateurs et lui permet de spécifier / étendre sa sémantique.

Il spécifie que deux comparateurs ne sont égaux que s’ils imposent le même ordre avec leur méthode compare (). Cela étend la sémantique de Object.equals () et doit donc être documenté dans l’interface.

La méthode equals() de Comparator est fournie pour forcer un utilisateur implémentant l’interface Comparator à implémenter equals() avec des règles et des contraintes supplémentaires en plus de celles déjà appliquées à equals() partir de Object .

La règle supplémentaire étant:

Cette méthode doit obéir au contrat général de Object.equals (Object) . En outre, cette méthode ne peut renvoyer la valeur true que si l’object spécifié est également un comparateur et impose le même ordre que ce comparateur. Ainsi, comp1.equals (comp2) implique que sgn (comp1.compare (o1, o2)) == sgn (comp2.compare (o1, o2)) pour chaque référence d’object o1 et o2 .

Mettre une méthode Object dans une déclaration d’interface permet à Javadoc de déclarer que le sens égal doit avoir dans les classes qui implémentent l’interface.

 Comparator interface have their own equals() method 

Bien,. Tout d’abord, il devrait être clair que chaque fois que vous implémentez une interface comparable, vous devez fournir à votre programme la possibilité de décider quand les objects sont égaux, inférieurs ou supérieurs.

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

La méthode equals () implémentée u héritée de la classe Object vérifie uniquement si les deux référencements pointent sur le même object ou non. Il n’applique aucune comparaison. C’est vous qui fournirez dans votre classe (ou éventuellement dans votre interface) les critères d’égalité des objects.

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

Évidemment, chaque fois que vous implémentez lorsque les objects sont inférieurs, supérieur à celui que vous devez implémenter lorsqu’ils sont égaux. donc plutôt que de compter sur la méthode par défaut Object equals (), vous devez fournir votre logique pour vérifier l’égalité