Switch案例中的最终变量。错误:需要常量表达式

时间:2017-04-12 12:39:12

标签: java switch-statement constants final

我知道在SO上有一些类似的问题,但我真的没有从我能找到的那些人那里得到答案。

我想知道为什么第一个例子是WORKING但第二个例子不是。

public class Person
{
    private final String FIRST_NAME = "Harley";
    private final String LAST_NAME  = "Davidson";

    public void display()
    {
        switch ("Harley")
        {
            case FIRST_NAME:
                System.out.println(FIRST_NAME);
                break;
            case LAST_NAME:
                System.out.println(LAST_NAME);
                break;
        }
    }
}

在这个中我将这些String变量作为参数传递。在方法声明中,我也使用final修饰符,但仍然出现Constant expression required错误。

public class Person
{
    public void display(final String fName, final String lName)
    {
        switch ("Harley")
        {
            case fName:
                System.out.println(fName);
                break;
            case lName:
                System.out.println(lName);
                break;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

常量表示编译时的常量,而不是在运行时。

编译器非常聪明,可以在编译时计算出你的第一个例子始终常量。所以它在编译时替换为常量。开关的情况总是不变的。

就第二个例子而言,您正在尝试使用动态案例进行切换。从理论上讲,您可以使用不同的参数调用第二个示例 - 因此它在运行时而不是编译时解析它们。这就是为什么它向您显示错误,因为开关不喜欢运行时级别变量作为案例(即使它们总是变得不变)。

答案 1 :(得分:0)

查找"常数"的定义在JLS中。它与final变量不同。