2010-05-04 10 views
8

Perhap questa è una semplice questione di fondoEsiste un modo simile a C per ottenere il numero dell'oggetto da enum in java?

Avere un enum

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

Posso avere il numero d'ordine, ad esempio ID = 0, GRUPPO = 2, DATA = 3, FAIL = 4?

Questo è un modo per farlo, ma uno strano e lungo! = 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; 
     } 

    }; 

per ottenere numeri in modo che scrivo TK.ID.get(), TK.GROUP.get(), ecc ... non mi piace che

c'è un modo migliore ?

(C enumerazioni, C macros..I perdere tutti e due)

grazie

+7

Tante risposte, ma nessuno ti dà fastidio di spiegare che nella maggior parte dei casi non dovresti usare l'ordinale. Non vuoi che il tuo programma dipenda dall'ordinamento dei tuoi valori enum. – Jorn

+3

@Jorn: i documenti API dicono "... La maggior parte dei programmatori non avrà alcun utilizzo per questo metodo ed è progettata per essere utilizzata da sofisticate strutture di dati basate su enum, come EnumSet ed EnumMap." – Yaneeve

+0

A volte non è così male, nel mio caso ho bisogno di enumare i titoli di una tabella CSV, quindi se questo dovesse cambiare è perché la tabella ha fatto, e questo non è molto probabile, al più nuove colonne saranno aggiunte alla fine, e ordinale sarà ancora utile penso che –

risposta

7

Stai cercando ordinal?

+1

Sì, stavo cercando quello! (non lasciare un codice pulito come C ...) ma beh, è ​​java haha, grazie –

2

È possibile utilizzare ordinali()

1

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

int public final ordinale()
Restituisce il numero ordinale di questa costante di enumerazione (la sua posizione nella sua dichiarazione enum, dove alla costante iniziale è assegnato un ordinale pari a zero). La maggior parte dei programmatori non avrà alcun uso per questo metodo. È progettato per l'uso da sofisticate strutture di dati basate su enum, come EnumSet e EnumMap.

14

Il ordinal() fa quello che vuoi fare. Questo è un estratto dalla documentazione:

restituisce il numero ordinale di questa costante censimento (la sua posizione nella sua enum dichiarazione, dove la costante iniziale viene assegnato un numero ordinale di zero). La maggior parte dei programmatori non avrà alcun utilizzo per questo metodo. È progettato per l'utilizzo da sofisticate strutture di dati basate su enum, come ad esempio EnumSet e EnumMap.

Josh Bloch in Effective Java 2nd Edition va oltre a spiegare il motivo per cui utilizzando ordinal() è una pessima idea. Ecco alcune citazioni, leggermente modificate:

Non derivare mai un valore associato a un enum dal suo ordinale; memorizzarlo invece in un campo istanza. (Elemento 31: utilizzare i campi di istanza anziché i numeri ordinali) È raro che sia appropriato utilizzare gli ordinali per indicizzare le matrici: utilizzare invece EnumMap. Il principio generale è che i programmatori di applicazioni dovrebbero utilizzare raramente, se non mai, Enum.ordinal.(Articolo 33: Utilizzare EnumMap invece di indicizzazione ordinale)

Il tuo modo "strano e lunga" è appunto la prescrizione di Articolo 31.

Fortunatamente, Java non è C. A Java enum è molto potente e flessibile, supportato da molte classi di librerie, e dovresti imparare ad abbracciarle invece di usare ordinal().

Dai un'occhiata a EnumMap per esempio.

Un'implementazione specializzata Map da utilizzare con chiavi di tipo enum. Tutte le chiavi in ​​una mappa enum devono provenire da un singolo tipo enum specificato, esplicitamente o implicitamente, quando viene creata la mappa. Le mappe Enum sono rappresentate internamente come array. Questa rappresentazione è estremamente compatta ed efficiente.

Cioè, invece di quanto segue (che è forse quello che si voleva fare):

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

arr[tk.ordinal()] = something; 

Si può invece fare:

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

map.put(tk, something); 

il libro copre anche un altro "tradizionale "(ab) uso di enum in C, cioè campi di bit (assegnazione di potenze di 2 a ciascuna costante ecc.). Bene, per quello Java ha invece EnumSet.

+2

@polygenelubricants: +1 ma proprio come * "la maggior parte dei programmatori non avrà alcun utilizzo per il numero interoOfLeadingZeros()" *. Ho sicuramente un uso molto valido per * ordinal() * e sono molto contento di non essere * "la maggior parte dei programmatori" * :) – SyntaxT3rr0r

+1

+1 grazie per la risposta lunga, sto solo leggendo "Effective Java"! ma non ho ancora raggiunto l'articolo 33 !! =) –

Problemi correlati