Una enumeración en Java implementa la Comparable
interfaz. Hubiera sido bueno anular Comparable
el compareTo
método, pero aquí está marcado como final. El orden natural por defecto en Enum
's compareTo
es el orden indicado.
¿Alguien sabe por qué las enumeraciones de Java tienen esta restricción?
java
enums
comparable
compareto
neu242
fuente
fuente
Respuestas:
Por coherencia, supongo ... cuando ve un
enum
tipo, sabe a ciencia cierta que su orden natural es el orden en el que se declaran las constantes.Para solucionar esto, puede crear fácilmente el suyo propio
Comparator<MyEnum>
y usarlo siempre que necesite un pedido diferente:Puede utilizar
Comparator
directamente:o úselo en colecciones o matrices:
Más información:
fuente
MyEnumComparator
no tiene estado, debería ser un singleton, especialmente si está haciendo lo que sugiere @Bombe; en su lugar, haría algo comoMyEnumComparator.INSTANCE.compare(enum1, enum2)
evitar la creación de objetos innecesariosLENGTH_COMPARATOR
campo estático en la enumeración. De esa manera, sería fácil de encontrar para cualquiera que esté usando la enumeración.Proporcionar una implementación predeterminada de compareTo que utilice el orden del código fuente está bien; hacerla definitiva fue un paso en falso por parte de Sun. El ordinal ya representa el orden de declaración. Estoy de acuerdo en que, en la mayoría de las situaciones, un desarrollador puede simplemente ordenar lógicamente sus elementos, pero a veces uno quiere que el código fuente esté organizado de una manera que haga que la legibilidad y el mantenimiento sean primordiales. Por ejemplo:
El orden anterior se ve bien en el código fuente, pero no es como el autor cree que debe funcionar compareTo. El comportamiento deseado de compareTo es que el orden sea por número de bytes. El ordenamiento del código fuente que haría que eso suceda degrada la organización del código.
Como cliente de una enumeración, no podría importarme menos cómo el autor organizó su código fuente. Sin embargo, quiero que su algoritmo de comparación tenga algún tipo de sentido. Sun ha puesto innecesariamente a los escritores de código fuente en un aprieto.
fuente
Los valores de enumeración se ordenan lógicamente con precisión según el orden en que se declaran. Esto es parte de la especificación del lenguaje Java. Por lo tanto, se deduce que los valores de enumeración solo se pueden comparar si son miembros de la misma Enum. La especificación quiere garantizar aún más que el orden comparable devuelto por compareTo () es el mismo que el orden en el que se declararon los valores. Ésta es la definición misma de enumeración.
fuente
Una posible explicación es que
compareTo
debería ser coherente conequals
.Y las
equals
enumeraciones deben ser coherentes con la igualdad de identidad (==
).Si
compareTo
no fuera definitivo, sería posible anularlo con un comportamiento que no fuera coherenteequals
, lo que sería muy contrario a la intuición.fuente
Si desea cambiar el orden natural de los elementos de su enumeración, cambie su orden en el código fuente.
fuente