2012-04-30 11 views
8

スイッチのケースで列挙型の値を文字列として使用できないのはなぜですか? (またはこの:)スイッチのケースで列挙型の文字列表現を使用する

String argument; 
switch (argument) { 
    case MyEnum.VALUE1.toString(): // Isn't this equal to "VALUE1" ? 
    // something  
break; 
    case MyEnum.VALUE2.toString(): 
    // something else 
break; 

答えて

22

コンパイル時に認識されている文字列しか使用できません。コンパイラはその式の結果を判別できません。

はおそらく、あなたはピーターLawreyのコメントに追加するには

String argument = ... 
switch(MyEnum.valueOf(argument)) { 
    case VALUE1: 

    case VALUE2: 
+0

重要なことは、 'VALUE1'は静的なことです。あなたは自分の 'myValueOf()'を持つことができ、それでも動作します。 –

+0

くそー、 'valueOf()'は 'case'に全くありません。私はその前のコメントを削除している、それを見ることはできません。再度、感謝します。 – Bloke

+3

引数が有効でない場合、NPEとIllegalArgumentExceptionをスローするvalueOf()に注意してください。 Blokeのコードは、これらの例外を処理するのを避けるために理にかなっています(しかし、残念ながらうまくいきません)。 – Nereis

5

ケースMyEnum.VALUE1.toStringと何が間違っている()://これは "VALUE1" と等しくありませんか?

いいえ、必ずしもではない:あなたが会社を離れた後、あなたはtoString()

public enum MyType { 
VALUE1 { 
    public String toString() { 
     return "this is my value one"; 
    } 
}, 

VALUE2 { 
    public String toString() { 
     return "this is my value two"; 
    } 
} 

}

の独自の実装を提供するのは自由です。また、あなたのコードを維持している誰かが、この実装を追加することができます。そのため、文字列の値に頼らず、代わりにenumの数値(数値はMyEnum.VALUE1MyEnum.VALUE2など)を使用してください。

+0

「あなたの列挙型の数値」? enumの列挙定数名を意味しますか? – assylias

+0

@assyliasもちろん、私はこれらの名前に対応する整数リテラルではなく、定数名を使用するのは間違いありません!ありがとう、私はこの重要な点を反映する答えを編集しました。 – dasblinkenlight

+0

ああ、そうです。それは良い説明です、ありがとうございます。 – Bloke

1

を試すことができ、前とJDK7後にJavaで文字列に切り替えについて説明し、昨年からthisポストを見ています。

+0

JDK7以前は不可能であったことさえ知りませんでした。ありがとう、それについての素晴らしいリンクがありました。[link](http://www.xefer.com/2006/12/switchonstring) - 文字列入力を処理する最良の方法は? – Bloke

+1

まあ、純粋主義者は、OOP言語でswitch/case文を使用しないでください。代わりに、このようなものに対処するための多態性戦略に進むべきです。IMOは、明確で、簡潔で、保守性があり、効率的であれば、多くのシナリオでケース/スイッチが最良のソリューションです。 – Sanjeev

-1

EDIT:Java質問へのC#回答のお詫び。私は何がそこに間違っていたのか分からない。

は、です。文字列値(列挙型の文字列値を含む)を使用できます。ただし、のコンパイル時定数のみを使用できます。実行時に評価する必要があるメソッドToString()を呼び出しています。単に与えられた変数、型、またはメンバーの(非修飾)名と一致する文字列に、コンパイル時に評価されるcase nameof(SomeEnum.SomeValue):

がNameOf():

はC#6のように、この一定の代替を使用することができ。その値はSomeEnum.ToString()の値と一致します。

関連する問題