149 votes

Java: Quelle est la différence entre la mise en œuvre Comparable et de Comparaison?

J'ai vu tous les deux utilisés. Quand voulez-vous utiliser l'un plutôt que l'autre?

245voto

Dan Points 1013

Le texte ci-dessous provient de la Comparaison vs Comparable

Comparable

Comparable objet est capable de se comparer avec un autre objet. La classe elle-même doit implémente java.lang.Interface Comparable afin d'être en mesure de comparer ses instances.

Comparateur

Un comparateur objet est capable de comparer deux objets différents. La classe n'est pas à comparer son cas, mais certains autres de la classe des instances. Ce comparateur de classe doit implémenter l' java.util.Comparator interface.

161voto

Jon Skeet Points 692016

La mise en œuvre de Comparable veut dire "je peux me comparer avec un autre objet." C'est particulièrement utile quand il y a une seule naturel de comparaison par défaut.

La mise en œuvre de Comparator veut dire "je peux comparer les deux autres objets." C'est particulièrement utile lorsqu'il y a plusieurs façons de comparaison de deux instances d'un type - par exemple, vous pouvez comparer les personnes selon l'âge, nom, etc.

39voto

KLE Points 11711

Comparables permet à une classe d'implémenter son propre comparaison:

  • c'est dans la même classe (il est souvent un avantage)
  • il peut y avoir un seul de la mise en œuvre (donc vous ne pouvez pas l'utiliser si vous le souhaitez deux cas différents)

Par comparaison, Comparateur est une comparaison externe:

  • il est généralement dans une instance unique (que ce soit dans la même classe ou dans un autre lieu)
  • vous indiquez le nom de chacun de mise en œuvre de la façon dont vous voulez trier les choses
  • vous pouvez fournir des éléments de comparaison pour les classes que vous ne contrôlez pas
  • la mise en œuvre est utilisable même si le premier objet est null


Dans les deux implémentations, vous pouvez toujours choisir ce que vous voulez être comparé. Avec les médicaments génériques, vous pouvez le déclarer, et vérifié à la compilation. Ce système améliore la sécurité, mais c'est aussi un défi pour déterminer la valeur appropriée.

A titre indicatif, j'utilise généralement la plupart des élèves de la classe ou de l'interface à laquelle l'objet peut être comparé, dans tous les cas d'utilisation, j'imagine... Pas très précise une définition bien ! :-(

  • Comparable<Object> vous permet de l'utiliser dans tous les codes au moment de la compilation (ce qui est bon si nécessaire, ou si mauvais pas et que vous perdez l'erreur de compilation) ; votre de la mise en œuvre doit faire face à des objets, et exprimés en tant que de besoin, mais dans un boîtier robuste.
  • Comparable<Itself> est très stricte sur le contraire.

C'est drôle, quand vous sous-classe elle-Même à la sous-classe, sous-classe doit aussi être Comparables et robuste sur lui (ou elle allait se briser Principe de Liskov, et vous donner des erreurs d'exécution).

14voto

starblue Points 29696

Comparable est de fournir une valeur par défaut de la commande sur des objets de données, par exemple si les objets de données ont un ordre naturel.

Un Comparator représente la commande elle-même pour une utilisation spécifique.

8voto

Michael Myers Points 82361

Comparable est généralement préférée. Mais parfois, une classe implémente déjà Comparable, mais que vous souhaitez trier sur une propriété différente. Ensuite, vous êtes obligés d'utiliser un Comparator.

Certaines classes réellement Comparators de communes des cas; par exemple, Strings sont, par défaut, la casse lors du tri, mais il y a aussi une statique Comparator appelés CASE_INSENSITIVE_ORDER.

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