Java switch语句:需要常量表达式,但它是常量

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (188)

所以,我正在研究这个有几个静态常量的类:

public abstract class Foo {
    ...
    public static final int BAR;
    public static final int BAZ;
    public static final int BAM;
    ...
}

然后,我想要一种基于常量获取相关字符串的方法:

public static String lookup(int constant) {
    switch (constant) {
        case Foo.BAR: return "bar";
        case Foo.BAZ: return "baz";
        case Foo.BAM: return "bam";
        default: return "unknown";
    }
}

但是,当我编译时,我constant expression required在每个3个案例标签上都出现错误。

我知道编译器需要在编译时知道表达式来编译开关,但为什么不是Foo.BA_常量?

提问于
用户回答回答于

我知道编译器需要在编译时知道表达式来编译开关,但为什么不是Foo.BA_常量?

尽管从字段初始化后执行的任何代码的角度来看,它们是不变的,但它们不是JLS所要求的编译时间常量 ; 有关常量表达式所需内容的定义,请参见§15.28常量表达式。这指的是§4.12.4最终变量,它定义了一个“常量变量”,如下所示:

我们调用一个原始类型或类型为String的变量,该变量是最终的,并且使用编译时常量表达式(第15.28节)作为常量变量进行初始化。变量是否为常量变量可能会影响类初始化(第12.4.1节),二进制兼容性(第13.1节,第13.4.9节)和明确赋值(第16节)。

在你的例子中,Foo.BA *变量没有初始值设定项,因此不符合“常量变量”的条件。修复很简单; 将Foo.BA *变量声明更改为具有编译时常量表达式的初始化程序。

用户回答回答于

你得到Constant表达式是必需的,因为你将这些值留在常量之外。尝试:

public abstract class Foo {
    ...
    public static final int BAR=0;
    public static final int BAZ=1;
    public static final int BAM=2;
    ...
}

扫码关注云+社区

领取腾讯云代金券