2011-12-05 14 views
5

Moje enum jest tak obecnie:Ustawienie wartości wyliczenia i analizowania ciąg aby uzyskać enum

public enum Manufacturers { 
    Honda, 
    GM, 
    Toyota, 
    Ferrari 
} 

muszę utworzyć HashMap więc mam zamiar to zrobić, jest to prawidłowe?

Manufacturers mfg = Manufacturers.Honda; 

mfg.ordinal() // save as key 

czyli będę przechowywania klucza za pomocą enumInstance.ordinal()

Również muszę być zdolne do analizowania ciąg, który będzie porządkowa wartość wyliczenia i uzyskać enum powrotem:

Manufacturers mfg = Manufacturers.valueOf(mfgOrdinalValueAsString); 

Powyższe spowodowało błąd (ciąg znaków "1"). Czy to jest właściwy sposób? Wydaje mi się, że powinienem spróbować/złapać?

Odpowiedz

2

Rzeczywiście oczekiwano ciągu "GM" (dla 1).

Jeśli chodzi o przechowywanie wartości wyliczenia na mapie, należy użyć EnumMap, który został zaprojektowany specjalnie do tego celu - i będzie również szybki.

Jeśli naprawdę chcesz odwołać się do wartości według jej liczby porządkowej, użyj czegoś takiego jak Manufacturers.values()[1].

+0

Nie mogę ustawić wartości porządkowej jawnie, próbowałem: GM ("5"), Toyota ("6") – Blankman

+1

Nie, nie możesz ich ustawić - porządki będą zgodne z kolejnością wartości są deklarowane w ramach wyliczenia. – ziesemer

+1

Jeśli z jakiegoś powodu potrzebujesz innej liczby "int" związanej z każdym elementem wyliczenia (poza tym, że jest ona automatycznie przypisana liczbą porządkową), zawsze możesz dodać ją jako atrybut do wyliczenia wraz z modułami pobierającymi –

2

Sugestia: lepiej użyć name() uzyskać nazwa z wyliczenia jako String, a kiedy trzeba wrócić do oryginału Enum z niego, należy użyć metody valueOf() - od valueOf() spodziewa nazwę, nie porządkowy, jako parametr. Na przykład:

enum Example {ONE, TWO}; 

String name = Example.ONE.name(); 
Example e = Example.valueOf(Example.class, name); // e has value ONE 

Jeśli na pewno trzeba użyć porządkowa, metoda ordinal() zwróci indeks za pomocą którego można pobierać odpowiednią Enum z tablicy zwróconej przez metodę values(). Tak:

int ordinal = Example.ONE.ordinal(); 
Example e = Example.values()[ordinal]; // e has value ONE 

Jak już zostało wskazane, należy rozważyć użycie EnumMap, jak podano w dokumentacji, to

Specjalistyczny realizacja mapa do użytku z klawiszami typu enum. Wszystkie klucze w mapie enum muszą pochodzić z pojedynczego typu wyliczeniowego, który jest określony, jawnie lub niejawnie, podczas tworzenia mapy. Mapy enum są reprezentowane wewnętrznie jako tablice. Ta reprezentacja jest niezwykle kompaktowa i wydajna.

EDIT

Jeśli trzeba skojarzyć inny kod do każdego elementu wyliczenia (inny niż automatycznie przypisany jej porządkowej), zawsze można dodać go jako atrybut do wyliczenia wraz z pobierające i ustawiające, na przykład:

public enum Manufacturers { 

    Honda(10), 
    GM(20), 
    Toyota(30), 
    Ferrari(40); 

    private int code; 

    Manufacturers(int code) { 
     this.code = code; 
    } 

    public int getCode() { 
     return code; 
    } 

    public void setCode(int code) { 
     this.code = code; 
    } 

} 

np

Manufacturers m = Manufacturers.Honda; 
System.out.println(m.getCode()); // prints 10 
m.setCode(100); 
System.out.println(m.getCode()); // prints 100 

Należy pamiętać, że nie można odtworzyć obiektu Enum z atrybutu code, ponieważ został on zdefiniowany przez programistę.

+0

, aby można było rzutować tylko za pomocą nazwy, a nie wartości porządkowej? – Blankman

+0

To prawda, do pobierania wyliczenia tylko za pomocą liczby porządkowej, użyj 'values ​​()'. Zaktualizowałem swoją odpowiedź przykładami kodu. –

Powiązane problemy