2011-11-16 4 views
177

私はint型を返す関数を持っています。しかし、私はTAX列挙の価値しか持っていません。enum値をintに変換するには?

TAX列挙型の値を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

[int型列挙型に一致する方法]の可能な重複(http://stackoverflow.com/questions/7996335/how-to-match-int-to-enum) – malat

答えて

273

エニュームをvalueと何らかの形で公開する必要があります。

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(); 
} 

(私はところで、もう少し従来と読みやすいように名前を変更しました。)

これは、コンストラクタに割り当てられた値をしたい仮定です。それがあなたが望むものでないなら、あなたは私達にもっと多くの情報を与える必要があります。

+11

ここには良いアイデアがありますhttp://stackoverflow.com/a/7996473/398348 – likejiujitsu

+0

@likejiujitsu:それは反対方向です。この質問では、OPは既に* Tax *型の値を持ち、それから数値を取得したいと考えています。 –

+0

私はそれを試してみて、それが失敗したことを認識する 'myEnumValue = MyEnum.valueOf(myInt);' argはString型でなければならないか? – likejiujitsu

16

コンストラクタで割り当てる値を使用する場合は、その値を返すために列挙型定義にメソッドを追加する必要があります。

enum値を表す一意の数値を使用する場合は、ordinal()を使用できます。

+2

注意してください。 'ordinal()'の有効なユースケースよりも 'ordinal()'に依存する開発的な反パターンがたくさんあります。 'enum'に固有の値を格納する必要がある場合は、単に' enum'を格納してください。 EnumSets、Enumのリスト、EnumMaps、利用可能な他のほぼすべてのEnumコレクションがあります。 –

+1

@EdwinBuck:それは指摘するのは良いことです、私はOPが彼が実際にintを望んでいたことを明確にしていないので、ordinal()の存在について言及したかっただけです。 – unholysampler

+0

序数を取得しないでください。これについてenum apiを確認してください。投票が削除されました。 –

161

私はこれを好む:その後、

public enum Color { 

    White, 

    Green, 

    Blue, 

    Purple, 

    Orange, 

    Red 
} 

を:

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

これは、Joshua Blochの著書「Effective Java(Second ed)」で誤った/推奨されていません。項目31を参照してください。 – user504342

+1

ordinal()メソッドの直接使用は推奨されていません。 – tonga

+25

@ user504342私は本の第2版を持っていないので、なぜそれが推奨されていないの要点を教えてくださいできますか? – likejiujitsu

6

いつかいくつかのC#のアプローチは、Javaの世界での生活が容易になります..:

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

これは私にとっては最も望ましい方法です。 DBのフレンドリーなデータ型であるenum(コード明快さ)のメリットが得られます。これを行うには100個の列挙型の選択肢を調べる必要はありません。シンプルで効果的。 –

1

多分それが使用することをお勧めします値が列挙型に追加されてもStringは有効なので、整数よりもString表現です。 enumのname()メソッドを使用して、enum値をStringに変換してenumのvalueOf()メソッドを使用して、Stringから列挙型表現を再度作成できます。次の例は、(ValueTypeには、列挙型である)バックStringに列挙値を変換する方法を示して:

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"); 
関連する問題