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 ?
Réponses
Trop de publicités?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 quesgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))
pour chaque référence d'objeto1
yo2
.
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.
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.
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.
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 .
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.
- Réponses précédentes
- Plus de réponses