123 votes

Quand utiliser Comparable et Comparateur

J'ai une liste d'objets que je dois trier sur un champ, disons Score. Sans trop réfléchir, j'ai écrit une nouvelle classe qui implémente Comparator, qui fait le travail et qui fonctionne.

Maintenant, en y repensant, je me demande si je n'aurais pas dû faire en sorte que ma classe implémente Comparable au lieu de créer une nouvelle classe qui implémente Comparator. Le score est le seul champ sur lequel les objets seront classés.

  1. Ce que j'ai fait d'acceptable comme pratique ?

  2. La bonne approche consiste-t-elle à "faire en sorte que la classe implémente d'abord Comparable (pour l'ordre naturel) et si une autre comparaison de champs est nécessaire, alors créer une nouvelle classe qui implémente Comparator" ?

  3. Si (2) ci-dessus est vrai, cela signifie-t-il que l'on doit implémenter Comparator seulement après que la classe ait implémenté Comparable ? (En supposant que je possède la classe originale).

136voto

BalusC Points 498232

Utilisez Comparable si vous voulez définir un default comportement d'ordonnancement (naturel) de l'objet en question, une pratique courante consiste à utiliser pour cela un identifiant technique ou naturel (base de données ?) de l'objet.

Utilisez Comparator si vous voulez définir un contrôlable de l'extérieur ce qui permet de remplacer le comportement d'ordonnancement par défaut.

4 votes

Il s'agit d'une explication technique, aussi correcte que possible, mais elle ne dit rien sur les meilleures pratiques.

46 votes

C'est dire quand d'utiliser chacun d'eux - si ce n'est pas une bonne pratique, qu'est-ce que c'est ?

1 votes

"Est-ce que la mise en œuvre Comparable signifie que je définis l'ordre naturel ?" J'ai trouvé la réponse que je cherchais. Merci :)

84voto

Yishai Points 42417

Je dirais qu'un objet devrait implémenter Comparable si c'est la façon la plus naturelle de trier la classe, et que quiconque aurait besoin de trier la classe voudrait généralement le faire de cette façon.

Si, toutefois, le tri est une utilisation inhabituelle de la classe, ou si le tri n'a de sens que pour un cas d'utilisation spécifique, alors un comparateur est une meilleure option.

En d'autres termes, étant donné le nom de la classe, sait-on comment un comparable pourrait trier, ou doit-on se contenter de lire la javadoc ? Dans ce dernier cas, il y a de fortes chances que tous les cas d'utilisation futurs du tri nécessitent un comparateur, auquel cas l'implémentation de comparable pourrait ralentir les utilisateurs de la classe, et non les accélérer.

0 votes

Pouvez-vous donner un exemple rapide ?

0 votes

Ce pourrait être un bon exemple : gist.github.com/yclian/2627608 Il existe une classe Version qui utilise ComparableVersion. Version - fournit des méthodes d'usine ComparableVersion est censé être un objet (sans méthodes statiques) - fournit une version qui peut être comparée à une autre. Les responsabilités sont séparées.

2 votes

Vous pouvez vous référer java-journal.blogspot.in/2011/01/

62voto

Bozho Points 273663

Utilisez Comparable :

  • si l'objet est sous votre contrôle.
  • si le comportement de comparaison est le principal comportement de comparaison.

Utilisez Comparator :

  • si l'objet est hors de votre contrôle et que vous ne pouvez pas le faire appliquer Comparable .
  • quand vous voulez un comportement de comparaison différent de celui par défaut (qui est spécifié par Comparable ).

13voto

Devang Paliwal Points 41

Comparable doit être utilisé lorsque vous comparez des instances de la même classe.

Le comparateur peut être utilisé pour comparer des instances de différentes classes.

Comparable est implémenté par la classe qui a besoin de définir un ordre naturel pour ses objets. Par exemple, String implémente Comparable.

Si un ordre de tri différent est nécessaire, implémentez le comparateur et définissez sa propre façon de comparer deux instances.

8voto

extraneon Points 13362

Je dirais :

  • si la comparaison est intuitive, alors il faut absolument mettre en œuvre Comparable
  • Si vous ne savez pas si votre comparaison est intuitive, utilisez un comparateur car il est plus explicite et donc plus clair pour la pauvre âme qui doit maintenir le code. explicite et donc plus clair pour la pauvre âme qui doit maintenir le code.
  • s'il y a plus d'une comparaison intuitive possible, je préférerais un Comparateur, éventuellement construit par une méthode d'usine dans la classe à comparer.
  • si la comparaison est spéciale, utilisez le comparateur.

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