27 votes

Pourquoi le comparateur déclare-t-il des égalités ?

L'interface du comparateur possède son propre equals() méthode. Toute classe obtiendra equals() par défaut par le biais de la classe d'objets. Quelle est la nécessité d'avoir equals() à l'intérieur d'une interface ?

10voto

aioobe Points 158466

Comparator affine le contrat de Object.equals : Il doit satisfaire aux contraintes fixées par Object.equals et puis d'autres .

En outre, cette méthode ne peut renvoyer un résultat positif que si l'objet spécifié est également un comparateur et qu'il 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'objet o1 y o2 .

Déclarer un equals à l'intérieur Comparator vous permet de documenter cela sous la forme d'une javadoc.

Notez que la documentation de l'API sert également de contrat, il ne s'agit donc pas d'une simple question de cosmétique. Il s'agit de contraintes explicites sur lesquelles les autres codes et votre code peuvent s'appuyer.

Dans des situations similaires où les méthodes sont moins bien établies, il peut également servir à documenter une intention. Par exemple, Interface.method devrait exister, quelle que soit l'évolution de ses superinterfaces.

4voto

Kazekage Gaara Points 7978

Depuis le site Java documentations la raison pour laquelle Comparator a ses propres equals() méthode :

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

4voto

JB Nizet Points 250258

Lire son javadoc . Il n'est là que pour expliquer ce que equals() doit être retournée si vous choisissez de la surcharger dans une classe implémentant un comparateur. On pourrait penser qu'aucun comparateur ne peut être égal à un autre, mais ce n'est pas le cas. On pourrait 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. La javadoc explique que deux comparateurs sont égaux s'ils imposent le même ordre, quels que soient les arguments donnés. La javadoc dit aussi :

Notez qu'il est toujours prudent de ne pas surcharger Object.equals(Object)

La plupart du temps, vous n'avez pas besoin d'ignorer les règles du equals() dans les comparateurs.

1voto

bpgergo Points 9407

De la documents :

il est toujours prudent de ne pas surcharger Object.equals(Object). Cependant, il n'est pas nécessaire de surcharger Object.equals(Object), le fait de passer outre 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 .

1voto

Ivin Points 472

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

En déclarant la méthode "equals" dans cette interface, on l'intègre à l'interface contrat entre l'appelant et les différents comparateurs et lui permet de spécifier/étendre sa sémantique.

Elle précise que deux comparateurs sont égaux uniquement s'ils imposent le même ordre avec leur méthode compare(). Cette méthode s'étend la sémantique de Object.equals() et doit donc être documentée dans l'interface.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X