2013-05-08 68 views
6

列挙型を定数式に変換する方法はありますか? は、私は私のスイッチオペレータが列挙型の値の中から選択したいが、私は、コンパイルエラー「ケース式は定数式でなければなりません」となったので、私は変数にそれを宣言しようとした:列挙型の定数式

final int REG = MyEnum.REG.getIndex().intValue(); 

switch (service.getIndex()) { 

case REG: 

しかし、私はまだ同じエラーが発生します。 Oracleのドキュメントhttp://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28

によると、コンパイル時定数式は、プリミティブ型、または急に完了しない文字列の値 を表す表現であり、唯一の次使用 に構成されていますリテラル•

をプリミティブ型と文字列型のリテラルの比較

リテラルを使用していないため、動作しません。私はそれを次のように宣言しなければならないと思う:

final int REG = 8; 

しかし、それを列挙型にリンクするほうがずっと良いだろう。これを行う方法はありますか?

EDIT

は私が最終的な変数を使用する必要はありませんが判明します。

switch (service) { 

case REG: 

Andreaさんのコメントが表示されるまで私には起こりませんでした。あなたの答えをありがとう。

+1

私は 'service.getIndexは()' '整数を返すことを前提としてい'、そう?あなたの列挙を返すようにそれを修正できますか? –

+1

Java 1.6までは 'switch-case'で' String'を使うことはできませんが、Java 7で使うことができます。FYI – Joshi

答えて

6

可能であれば、getIndex()メソッドを変更して、整数ではなく列挙型を返すようにします。これが不可能な場合は、列挙型の要素にマップインデックスする必要があります。

次のenumを考える:

public enum Index { 
    ONE, 
    TWO, 
    THREE 
} 

をあなたは

Index.values()[index] 
を使用して列挙型の要素にあなたのインデックスをマッピングすることができます

あなたの方法Integer getIndex()を考えると、あなたはその後、

switch(Index.values()[getIndex()]) 
    case ONE : ... 
     break; 

    case TWO : ... 
     break; 

    case THREE : ... 
     break; 
} 
のような何かを行うことができます

enum内のインデックスにアクセスしようとすると、ArrayIndexOutOfBoundsExceptionが返される可能性があることに注意してください。上記のサンプルで、getIndex()が値> 2を返す場合)。


私はデフォルトvalueOf(String s)に似valueOf(int index)、のような列挙方式への発現Index.values()[getIndex()]をカプセル化します。また、有効な配列インデックスチェックを処理することもできます(たとえば、インデックスが範囲外の場合は特別な列挙型の値を返します)。同様に、あなたがしても特別な意味を持って離散値に変換することができます - どのような場合には、それは一般的に、あなたのgetIndex()方法から得る値の範囲に依存し、あなたが望むどのよう

public enum Index { 
    ZERO, 
    ONE, 
    TWO, 
    THREE, 
    REG, 
    INVALID; 


    public static Index valueOf(int index) { 

     if (index == 8) { 
      return REG; 
     } 

     if (index >= values().length) { 
      return INVALID; 
     } 

     return values()[index]; 
    } 
} 

をこれは一例に過ぎませんそれらをenum要素にマップします。

あなたは、それが毎回その配列のコピーを返す必要があるため values()は高価な操作であることを、いくつかの追加情報(特にヒントを

switch(Index.valueOf(service.getIndex())) { 
    case ZERO : ... break; 
    ... 
    case REG : ... break; 
    ... 
} 

などの参照もCast Int to enum in Javaそれを使用することができます

が呼び出されます)。

+0

それは私のために働いた!どうもありがとう! – Mauker

2

あなたが列挙constactsに割り当てられた特定の数値は、あなたがこのようにそれを使用し、この

enum MyReg { 
    REG(8), OTHER(13); 

    public final int value; 
    MyReg(int value) { 
     this.value=value; 
    } 
} 

のように行きたい場合は、次の

class Test { 
    public static void main(String[] args) { 
     MyReg reg = MyReg.REG; 
     switch (reg) { 
     case OTHER: 
      System.out.println(reg.value); 
      break; 
     case REG: 
      System.out.println(reg.value); 
      break; 
     } 
    } 
}