web-dev-qa-db-ja.com

switch-caseでの列挙値の文字列表現の使用

スイッチケースで列挙値を文字列として使用できないのはなぜですか? (またはこれの何が問題になっていますか:)

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

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

おそらくあなたは試すことができます

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

   case VALUE2:
33
Peter Lawrey

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

}

さらに、あなたのコードを維持している誰かが、あなたが会社を辞めた後にこの実装を追加する可能性があります。そのため、文字列値に依存せず、代わりにenumsの数値(定数MyEnum.VALUE1MyEnum.VALUE2などで表される)を使用することに固執する必要があります。

7
dasblinkenlight

Peter Lawreyのコメントに追加するには、JDK7の前後のJavaでの文字列の切り替えについて説明している昨年の this 投稿をご覧ください。

1
Sanjeev