【发布时间】:2017-04-12 12:39:11
【问题描述】:
我知道在 SO 上有一些类似的问题,但我真的没有从那些我能找到的人那里得到答案。
我想知道为什么第一个示例有效,而第二个示例无效。
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;
}
}
}
在这一个中,我将这些字符串变量作为参数传递。在方法声明中,我也使用了 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;
}
}
}
【问题讨论】:
-
switch 语句中的 case 需要是编译时常量。在您的第二个示例中,它们是函数参数,因此它们在运行时之前是未知的。 (也许你只用相同的两个值调用它,但编译器正在考虑方法的上下文,而不是整个程序的上下文。)
-
第二个示例不起作用,因为您可以将任何内容传递给您的 display 方法,并且不能动态生成 switch 语句。想想如果你打电话给
display("test", "test")或display(null, null)会发生什么 -
我明白了。谢谢两位的解释。
标签: java switch-statement constants final