【问题标题】:Final variable in Switch case. Error: Constant expression requiredSwitch case 中的最终变量。错误:需要常量表达式
【发布时间】: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


【解决方案1】:

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

编译器足够聪明,可以在编译时计算出您的第一个示例始终是常量。因此它在编译时替换为常量。 switch 的 case 总是不变的。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      相关资源
      最近更新 更多