OMG. Przecież typ enum ma metodę ordinal(), która podaje dla każdego wyliczenia jego indeks liczony od zera i identyczny z kolejnością deklarowania samych elementów tego wyliczenia. Jest to najprostsza konwersja na typ int. A w odwrotną stronę mając wyliczenie e jakiegoś typu enum {...} używa się e.getDeclaringClass().getEnumConstants()[i] gdzie i, to właśnie indeks będący numerem wyliczenia. Za pomocą e.getDeclaringClass().getEnumConstants().length dostajemy długość wyliczenia, czyli ilość wszystkich jego elementów. Można sobie więc puścić taki kod:
public enum Autostrada { A1, A2, A3, A4, A5, A6, A7, W_BUDOWIE }
//--------
public class Test
{
public static void main(String[] args)
{
Autostrada el = Autostrada.A5; //obiekt z palca
System.out.println( "Element" + el.toString()
+ " ma pozycję " + el.ordinal() + "/"
+ (el.getDeclaringClass().getEnumConstants().length - 1) );
int x = 4;
Class<Autostrada> c = Autostrada.class;
el = c.getEnumConstants()[x]; //obiekt z runtime
System.out.println( "Element o indeksie " + x
+ " w wyliczeniu " + c.getSimpleName()
+ ", to będzie: " + el.toString() );
}
}
Żeby się przekonać, że konwersja dowolnego wyliczenia na int, i z powrotem jest trywialna.
Tak więc kłania się znajomość podstaw Javy. ;-P
Warto zauważyć, że nie ma żadnych importów. To wszystko cechy języka i runtime'a.
Dodatkowo można użyć też dynamicznej tablicy (rzekomo bitowej) EnumSet<E>, która jest normalnym rozszerzalnym zbiorem typu AbstractSet<E> i Collection<E> aby móc wygodnie przechowywać stan włączenia/wyłączenia (istnienia/nieistnienia) wszystkich elementów dowolnego wyliczenia. Rzekomo miał być szybki bo operować na bitach zmiennych long (do 64 pozycji miał to być tylko jeden long), ale jak spojrzałem do źródeł to implementacja bitowa, to chyba jakaś pieśń przyszłości. Na dodatek wpakowano to do bieżącej hierarchii kolekcji Javy, co spowodowało, że do tego typu wpakowało się mnóstwo niewygodnych zaszłości. No, ale to tak na marginesie.
Ja w każdym razie zrobiłem sobie własną implementację takiego typu template w oparciu o stary i szybki BitSet. Nie mam czasu na czekanie na Javę 7. [diabel] Z użyciem wyżej podanych konwersji jest to banał.