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

时间:2016-10-31 06:01:34

标签: 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;
}

3 个答案:

答案 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语句需要一个常量值