2011-12-05 31 views
5

私の列挙型を取得するために文字列を解析することは、現在、このようなものです:私はこれを行うことを計画してHashMapを作成する必要がが列挙の値を設定し、列挙型

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

、これは正しいでしょうか?

Manufacturers mfg = Manufacturers.Honda; 

mfg.ordinal() // save as key 

私はまた、私が列挙の序数値も、バック列挙型を取得します文字列を解析できるようにする必要がありenumInstance.ordinal()

を使用してキーを格納します。すなわち:

Manufacturers mfg = Manufacturers.valueOf(mfgOrdinalValueAsString); 

上記は私にエラー(文字列は "1")を与えました。これは正しい方法ですか?私は試してみるべきだと思いますか?

答えて

2

.valueOfは実際には文字列 "GM"(1の場合)を期待しています。

enum値をマップに保存するには、具体的にこのために設計されたEnumMapを使用します。これも高速です。

実際に序数で値を参照する場合は、Manufacturers.values()[1]などを使用します。

+0

GM( "5")、Toyota( "6") – Blankman

+1

いいえ、設定できません。序数は値は列挙型の中で宣言されます。 – ziesemer

+1

なんらかの理由で、列挙の各要素(自動的に割り当てられた序数以外)に関連した別の 'int'番号が必要な場合は、getterとともにenumに属性として追加することができます –

2

提案:より良いStringとして列挙型の名前を取得するためにname()を使用して、あなたはそれから元Enumを取り戻すために必要があるとき、valueOf()メソッドを使用します - valueOf()名前を期待するので、ありませんパラメータとして序数。たとえば:あなたは間違いなく、序数を使用する必要がある場合

enum Example {ONE, TWO}; 

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

ordinal()方法は、あなたがvalues()メソッドが返す配列からそれぞれのEnumを取得するために使用することができますインデックスを返します。このように:ドキュメントに記載されているように、既に指摘されている

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

として、EnumMapの使用を検討し、それが

enum型のキーで使用するための特殊なMap実装です。 enumマップのすべてのキーは、マップの作成時に明示的または暗黙的に指定された単一の列挙型から来なければなりません。 Enumマップは内部的に配列として表されます。この表現は非常にコンパクトで効率的です。

EDIT

あなたは(その自動的に割り当てられる序以外の)列挙型の各要素に異なるコードを関連付ける必要がある場合は、常に一緒に、列挙型の属性として追加することができますこのようなゲッターとセッター、例えば:

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

} 

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

code属性のEnumオブジェクトは、プログラマによって定義されているため、再構築できないことに注意してください。

+0

を行う方法を示すために、序数の値ではなく名前を使ってキャストするだけですか? – Blankman

+0

それは、序数だけを使ってenumを取得するには、 'values()'を使ってください。コード例を使って私の答えを更新しました。 –