当我在Eclipse中输入以下代码时,它会抱怨" case表达式必须是常量表达式"。如果数组标记为final
,则其内容必须是常量。为什么这个无效?
final String[] match={"a","b","c"};
switch (switchVar) {
case match[0]: /* Eclipse complains here about nonconstant switch */
System.out.println("Matches");
break;
default:
System.out.println("No Match");
break;
}
答案 0 :(得分:6)
阵列没有任何常数。其内容可能随时发生变异。 引用会说同样的内容,但match[0]
在任何时间点都可能有所不同。
你有使用常量值;一个保证不会改变的。保证枚举,原始文字(以及它们的盒装对应物)和String
文字等内容不会因此过程而改变,并且可以使用。
然而, 意味着您可以使用标记为final
并且不可变的变量。由于数组类型 是可变的,因此即使您将其重新分配给final
变量,它也无法解决问题。你必须声明文字。
下面是一个简单的代码段,修改现有代码:
String switchVar = "a";
final String matchZero = "a";
switch (switchVar) {
case matchZero: // valid since there's no way matchZero can ever be mutated
System.out.println("Matches");
break;
default:
System.out.println("No Match");
break;
}
答案 1 :(得分:1)
如果数组标记为final,则其内容必须是常量。
这是一个错误的理解。最终变量仅阻止创建数组的新实例,但它不会阻止更改数组的内容。我可以使用您现有的代码执行此操作,它将是有效的:
final String[] match = {"a", "b", "c"};
match[0] = "b"; // CHANGE HERE
switch (switchVar) {
case "a": //Fixing this to make it compile
/* Eclipse complains here about nonconstant switch */
System.out.println("Matches");
break;
default:
System.out.println("No Match");
break;
}
要使代码编译并使用switch语句,您需要使用常量。因此,无论是声明常量还是就地使用字符串都可以使它工作。
final String[] match = {"a", "b", "c"};
switch (switchVar) {
case "a": // CHANGE HERE
/* Eclipse complains here about nonconstant switch */
System.out.println("Matches");
break;
default:
System.out.println("No Match");
break;
}
之所以这样,只是因为The Java Language Specification on switch statements假设所有switch语句都适用于常量表达式。
答案 2 :(得分:0)
你的问题是'最终',
final String[] match = {"a", "b", "c"};
这意味着不能更改数组匹配的地址,但这并不意味着数组macth的值无法更改。
并且case语句需要一个常量值