2010-05-04 11 views
8

Perhap esto es una simple pregunta básica¿Hay alguna forma de C para obtener el número de artículo de enum en java?

Tener una enumeración

public enum TK{ 
     ID,GROUP,DATA,FAIL; 
     } 

¿Puedo obtener el número de pedido, por ejemplo, ID = 0, GRUPO = 2, DATOS = 3, FALLO = 4?

¡Esto es una manera de lograrlo, pero es extraño y largo! = S

public enum TK{ 
     ID(0),GROUP(1),DATA(2),FAIL(3); 

     int num; 
     TK(int n) 
     { 
      this.num=n; 
     } 

     public int get() 
     { 
      return num; 
     } 

    }; 

para obtener los números de modo que escribo TK.ID.get(), TK.GROUP.get(), etc ... no me gusta que

hay una manera mejor ?

enumeraciones (C, C macros..I te extraño tanto)

gracias

+7

Tantas respuestas, sin embargo, no molesta explicar que no debe usar ordinal en la mayoría de los casos. No desea que su programa dependa del orden de sus valores enum. – Jorn

+3

@Jorn: los API Doc dicen "... La mayoría de los programadores no tendrán ningún uso para este método. Está diseñado para ser utilizado por sofisticadas estructuras de datos basadas en enumeración, como EnumSet y EnumMap". – Yaneeve

+0

A veces no es tan malo, en mi caso necesito enumerar los Títulos de una tabla csv así que si esto cambiara porque la tabla sí lo hizo, y eso no es muy probable, como máximo se agregarán nuevas columnas al final, y ordinal Todavía ser útil Creo que –

Respuesta

7

¿Está buscando una ordinal?

+1

Sí, estaba buscando eso! (no permite un código limpio como C ...) pero bueno, es java jaja, gracias –

2

Puede utilizar ordinal()

1

http://java.sun.com/javase/6/docs/api/java/lang/Enum.html#ordinal()

final int pública ordinal()
Devuelve el ordinal de esta constante de enumeración (su posición en su declaración enum, donde a la constante inicial se le asigna un ordinal de cero). La mayoría de los programadores no tendrán uso para este método. Está diseñado para ser utilizado por estructuras de datos sofisticadas basadas en enumeración, como EnumSet y EnumMap.

14

El ordinal() hace lo que quiere hacer. Este es un extracto de la documentación:

Devuelve el ordinal de esta constante de enumeración (su posición en su declaración enum, donde la constante inicial se le asigna un ordinal de cero). La mayoría de los programadores no tendrán ningún uso para este método. Está diseñado para ser utilizado por sofisticadas estructuras de datos basadas en enumeración, como EnumSet y EnumMap.

Josh Bloch en eficaz de Java 2ª Edición va más allá para explicar por qué el uso de ordinal() es una idea terrible. Aquí hay algunas citas, ligeramente editadas:

Nunca derive un valor asociado con una enumeración de su ordinal; guárdelo en un campo de instancia en su lugar. (Elemento 31: Usar campos de instancia en lugar de ordinales) Rara vez es apropiado utilizar ordinales para indexar matrices: use EnumMap en su lugar. El principio general es que los programadores de aplicaciones rara vez, o nunca, deben usar Enum.ordinal.(Artículo 33: Utilice EnumMap en lugar de indexación ordinal)

Su manera "extraña y larga" es precisamente la prescripción del artículo 31.

Afortunadamente, Java no es C. Un Java enum es muy potente y flexible, con el respaldo de muchas clases de biblioteca, y usted debe aprender a abrazarlos en lugar de usar ordinal().

Eche un vistazo a EnumMap por ejemplo.

Implementación especializada de Map para usar con las claves de tipo enum. Todas las claves en un mapa enum deben provenir de un único tipo enum que se especifica, explícita o implícitamente, cuando se crea el mapa. Los mapas Enum están representados internamente como matrices. Esta representación es extremadamente compacta y eficiente.

Es decir, en lugar de lo siguiente (que es tal vez lo que quería hacer):

T[] arr = ...; 
TK tk = ...; 
T something = ...; 

arr[tk.ordinal()] = something; 

su lugar, puede hacer:

Map<TK,T> map = new EnumMap<TK,T>(TK.class); 
TK tk = ...; 
T something = ...; 

map.put(tk, something); 

El libro también cubre otro "tradicional "(ab) uso de enum en C, es decir, campos de bits (asignando potencias de 2 a cada constante, etc.). Bueno, para eso Java tiene EnumSet en su lugar.

+2

@polygenelubricants: +1 pero al igual que * "la mayoría de los programadores no tendrán uso para NumberOfLeadingZeros()" * de Integer. Definitivamente tengo un uso muy válido para * ordinal() * y estoy muy contento de no ser * "la mayoría de los programadores" * :) – SyntaxT3rr0r

+1

+1 gracias por la respuesta larga, ¡solo estoy leyendo "Effective Java"! ¡pero aún no llegué al punto 33! =) –

Cuestiones relacionadas