为什么最终变量不能用在switch语句中?

rle*_*827 4 java switch-statement

当我在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;
}
Run Code Online (Sandbox Code Playgroud)

Mak*_*oto 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;
}
Run Code Online (Sandbox Code Playgroud)