我知道在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;
}
}
}
答案 0 :(得分:2)
常量表示编译时的常量,而不是在运行时。
编译器非常聪明,可以在编译时计算出你的第一个例子始终常量。所以它在编译时替换为常量。开关的情况总是不变的。
就第二个例子而言,您正在尝试使用动态案例进行切换。从理论上讲,您可以使用不同的参数调用第二个示例 - 因此它在运行时而不是编译时解析它们。这就是为什么它向您显示错误,因为开关不喜欢运行时级别变量作为案例(即使它们总是变得不变)。
答案 1 :(得分:0)
查找"常数"的定义在JLS中。它与final
变量不同。