スイッチケースで列挙値を文字列として使用できないのはなぜですか? (またはこれの何が問題になっていますか:)
String argument;
switch (argument) {
case MyEnum.VALUE1.toString(): // Isn't this equal to "VALUE1" ?
// something
break;
case MyEnum.VALUE2.toString():
// something else
break;
コンパイル時に認識されている文字列のみを使用できます。コンパイラーは、その式の結果を判別できません。
おそらくあなたは試すことができます
String argument = ...
switch(MyEnum.valueOf(argument)) {
case VALUE1:
case VALUE2:
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";
}
}
}
さらに、あなたのコードを維持している誰かが、あなたが会社を辞めた後にこの実装を追加する可能性があります。そのため、文字列値に依存せず、代わりにenum
sの数値(定数MyEnum.VALUE1
、MyEnum.VALUE2
などで表される)を使用することに固執する必要があります。
Peter Lawreyのコメントに追加するには、JDK7の前後のJavaでの文字列の切り替えについて説明している昨年の this 投稿をご覧ください。