48 votos

¿Por qué es compareTo en una Enumeración final en Java?

Una Enumeración en Java implementa la interfaz Comparable. Habría sido agradable para reemplazar Comparable del método compareTo, pero aquí es marcado como final. El valor predeterminado orden natural en la Enumeración compareTo es el orden listado. ¿Alguien sabe por qué Java Enum tiene esta restricción?

75voto

Zach Scrivena Puntos 15052

Para mantener la coherencia supongo... cuando ves un enum tipo de, usted sabe que es un hecho que su natural orden es el orden en el que las constantes se declaran.

Para evitar esto, usted puede crear fácilmente sus propios Comparator<MyEnum> y usarlo siempre que usted necesite un orden diferente:

enum MyEnum
{
    DOG("woof"),
    CAT("meow");

    String sound;    
    MyEnum(String s) { sound = s; }
}

class MyEnumComparator implements Comparator<MyEnum>
{
    public int compare(MyEnum o1, MyEnum o2)
    {
    	return -o1.compareTo(o2); // this flips the order
    	return o1.sound.length() - o2.sound.length(); // this compares length
    }
}

Usted puede utilizar el Comparator directamente:

MyEnumComparator c = new MyEnumComparator();
int order = c.compare(MyEnum.CAT, MyEnum.DOG);

o usarla en las colecciones o las matrices:

NavigableSet<MyEnum> set = new TreeSet<MyEnum>(c);
MyEnum[] array = MyEnum.values();
Arrays.sort(array, c);

Más información:

13voto

Thomas Paine Puntos 61

Proporciona una implementación por defecto de compareTo que utiliza el código fuente de pedidos está bien; lo que es final fue un paso en falso Sol. El ordinal ya representa el orden de declaración. Estoy de acuerdo en que en la mayoría de situaciones, un desarrollador puede sólo lógicamente orden de sus elementos, pero a veces uno quiere que el código fuente se organiza de una manera que hace que la lectura y el mantenimiento que es de suma importancia. Por ejemplo:


  //===== SI BYTES (10^n) =====//

  /** 1,000 bytes. */ KILOBYTE (false, true,  3, "kB"),
  /** 10

La anterior ordenación se ve bien en el código fuente, pero no es cómo el autor cree que el compareTo debería funcionar. El deseado compareTo comportamiento es tener ordenar por número de bytes. El código fuente, ordenando que tendría que suceder degrada la organización del código.

Como cliente de una enumeración que no le importa cómo el autor organiza su código fuente. Yo quiero que su algoritmo de comparación para hacer algún tipo de sentido, sin embargo. El sol ha innecesariamente poner el código fuente de los escritores en un aprieto.

6voto

Martin OConnor Puntos 1877

Los valores de enumeración son precisamente ordenado lógicamente según el orden en que se declaran. Esto es parte de la de la especificación del lenguaje Java. Por lo tanto, se deduce que los valores de enumeración sólo se pueden comparar si son miembros de la misma Enumeración. La especificación quiere garantizar que el comparable pedido devuelto por compareTo() es el mismo que el orden en el que los valores fueron declarados. Esta es la definición misma de una enumeración.

0voto

random coder Puntos 1

Otro ejemplo: y enumeración de las cartas de juego con Rango y Adaptarse a los miembros cuando desee compareTo volver no en el léxico orden de los 52 a los valores, sino el rango de comparación. Por cierto, porque el automático compareTo compara en léxico de la orden, que nunca volverán a 0.

-1voto

Bombe Puntos 34185

Si desea cambiar el orden natural de su enumeración de los elementos, cambiar su orden en el código fuente.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: