Une énumération en Java implémente l' Comparable
interface. Cela aurait été bien de surcharger Comparable
la compareTo
méthode, mais ici, elle est marquée comme définitive. L'ordre naturel par défaut sur Enum
les compareTo
est l'ordre indiqué.
Est-ce que quelqu'un sait pourquoi une énumération Java a cette restriction?
java
enums
comparable
compareto
neu242
la source
la source
Réponses:
Par souci de cohérence, je suppose ... quand vous voyez un
enum
type, vous savez pertinemment que son ordre naturel est l'ordre dans lequel les constantes sont déclarées.Pour contourner ce problème, vous pouvez facilement créer le vôtre
Comparator<MyEnum>
et l'utiliser chaque fois que vous avez besoin d'un ordre différent:Vous pouvez utiliser
Comparator
directement:ou utilisez-le dans des collections ou des tableaux:
Informations complémentaires:
la source
MyEnumComparator
n'y a pas d'état, il ne devrait s'agir que d'un singleton, surtout si vous faites ce que @Bombe suggère; à la place, vous feriez quelque chose commeMyEnumComparator.INSTANCE.compare(enum1, enum2)
pour éviter la création d'objets inutilesLENGTH_COMPARATOR
champ statique de l'énumération. De cette façon, il serait facile de trouver pour quiconque utilise l'énumération.Fournir une implémentation par défaut de compareTo qui utilise l'ordre du code source est très bien; le rendre définitif était un faux pas de la part de Sun. L'ordinal tient déjà compte de l'ordre de déclaration. Je suis d'accord que dans la plupart des situations, un développeur peut simplement ordonner logiquement ses éléments, mais parfois on veut que le code source soit organisé de manière à rendre la lisibilité et la maintenance primordiales. Par exemple:
L'ordre ci-dessus semble bon dans le code source, mais ce n'est pas la façon dont l'auteur pense que compareTo devrait fonctionner. Le comportement compareTo souhaité est que le tri soit par nombre d'octets. L'ordre du code source qui permettrait que cela se produise dégrade l'organisation du code.
En tant que client d'une énumération, je me fiche de la manière dont l'auteur a organisé son code source. Je veux cependant que leur algorithme de comparaison ait un sens. Sun a inutilement mis les écrivains de code source dans une liaison.
la source
Les valeurs d'énumération sont ordonnées logiquement avec précision en fonction de l'ordre dans lequel elles sont déclarées. Cela fait partie de la spécification du langage Java. Par conséquent, il s'ensuit que les valeurs d'énumération ne peuvent être comparées que si elles sont membres du même Enum. La spécification veut en outre garantir que l'ordre comparable renvoyé par compareTo () est le même que l'ordre dans lequel les valeurs ont été déclarées. C'est la définition même d'une énumération.
la source
Une explication possible est que cela
compareTo
devrait être cohérent avecequals
.Et
equals
pour les énumérations doivent être cohérentes avec l'égalité d'identité (==
).Si
compareTo
où être non définitif, il serait possible de le remplacer par un comportement qui n'est pas cohérent avecequals
, ce qui serait très contre-intuitif.la source
Si vous souhaitez modifier l'ordre naturel des éléments de votre énumération, modifiez leur ordre dans le code source.
la source