2011-11-16 14 views
177

Mam funkcję, która zwraca typ int. Jednak mam tylko wartość wyliczenia TAX.Jak przekonwertować wartość wyliczenia na int?

Jak mogę rzucić wartość wyliczenia TAX na int?

public enum TAX { 
    NOTAX(0),SALESTAX(10),IMPORTEDTAX(5); 

    private int value; 
    private TAX(int value){ 
     this.value = value; 
    } 
} 

TAX var = TAX.NOTAX; // This value will differ 

public int getTaxValue() 
{ 
    // what do do here? 
    // return (int)var; 
} 
+1

Możliwy duplikat [Jak dopasować int do wyliczenia] (http://stackoverflow.com/questions/7996335/how-to-match-int-to-enum) – malat

Odpowiedz

273

W pewnym sensie trzeba wyobrazić wyliczanie value, np.

public enum Tax { 
    NONE(0), SALES(10), IMPORT(5); 

    private final int value; 
    private Tax(int value) { 
     this.value = value; 
    } 

    public int getValue() { 
     return value; 
    } 
} 

... 

public int getTaxValue() { 
    Tax tax = Tax.NONE; // Or whatever 
    return tax.getValue(); 
} 

(Zmieniłem nazwy być nieco bardziej konwencjonalny i czytelny, btw.)

To zakładając chcesz wartość przypisaną w konstruktorze. Jeśli nie tego chcesz, musisz podać nam więcej informacji.

+11

jest lepszy pomysł tutaj http://stackoverflow.com/a/7996473/398348 – likejiujitsu

+0

@likejiujitsu: To idzie w przeciwnym kierunku. W tym pytaniu OP już * ma * wartość typu 'Tax' i chce uzyskać wartość liczbową z niego. –

+0

Po prostu wypróbowałem i zdałem sobie sprawę, że zawodzi "myEnumValue = MyEnum.valueOf (myInt);" arg musi być typu String - czy jest coś, czego mi brakuje? – likejiujitsu

16

Jeśli chcesz wartość, którą przypisujesz w konstruktorze, musisz dodać metodę w definicji wyliczeniowej, aby zwrócić tę wartość.

Jeśli chcesz uzyskać unikalny numer, który reprezentuje wartość wyliczenia, możesz użyć ordinal().

+2

Uważaj. Istnieje wiele bardziej rozwojowych anty-wzorców, które opierają się na 'ordinal()' niż poprawnych przypadkach użycia 'ordinal()'. Jeśli chcesz przechowywać unikalną wartość dla 'wyliczenia', po prostu zapisz' wyliczenie'. Dostępne są EnumSet, listy wyliczeń, EnumMaps i prawie każda inna kolekcja Enum. –

+1

@EdwinBuck: Warto to podkreślić, po prostu chciałem wspomnieć o istnieniu 'ordinal()', ponieważ OP nie wyjaśnił, czym chciałby być int. – unholysampler

+0

Nie rób porządkowych. Proszę sprawdzić api api w związku z tym. Up-vote usunięte. –

161

Wolę to:

public enum Color { 

    White, 

    Green, 

    Blue, 

    Purple, 

    Orange, 

    Red 
} 

następnie:

//cast enum to int 
int color = Color.Blue.ordinal(); 
+27

Jest to niepoprawne/niezalecane przez Joshua Blocha w jego książce Efektywna Java (wyd. 2). Patrz pozycja 31. – user504342

+1

Bezpośrednia metoda ordinal() nie jest zalecana. – tonga

+25

@ user504342 Nie mam drugiej edycji książki, więc czy możesz podać nam dlaczego nie jest to zalecane? – likejiujitsu

6

Sometime niektóre C# podejście sprawia, że ​​życie staje się łatwiejsze w świecie Javy ..:

class XLINK { 
static final short PAYLOAD = 102, ACK = 103, PAYLOAD_AND_ACK = 104; 
} 
//Now is trivial to use it like a C# enum: 
int rcv = XLINK.ACK; 
+0

Dla mnie jest to najbardziej pożądana droga. Dostaję korzyści z enum (klarowność kodu), typ danych przyjazny dla DB, i nie muszę badać 100 alternatywnych enum, aby zrobić to "drogą androidową". Prosty i skuteczny. –

1

Może lepiej użyć reprezentacja łańcuchów niż liczba całkowita, ponieważ łańcuch jest nadal ważny, jeśli wartości są dodawane do wyliczenia. Możesz użyć metody name() enum, aby przekonwertować wartość wyliczenia na ciąg i metodę valueOf() enum, aby ponownie utworzyć reprezentację enum z ciągu. Poniższy przykład pokazuje, w jaki sposób przekonwertować wartość enum do String iz powrotem (ValueType jest enum):

ValueType expected = ValueType.FLOAT; 
String value = expected.name(); 

System.out.println("Name value: " + value); 

ValueType actual = ValueType.valueOf(value); 

if(expected.equals(actual)) System.out.println("Values are equal"); 
Powiązane problemy