Java Switch 语句:常量表达式需求故障排除
在所呈现的场景中,switch 语句尝试将整型常量与定义的静态常量进行匹配在抽象类中。但是,编译失败并出现“需要常量表达式”错误。
可以理解,编译时常量表达式对于 switch 语句是必需的。然而,Foo.BAR、Foo.BAZ 和 Foo.BAM 常量似乎是常量。
为什么这些常量不被视为编译时常量表达式?
根据 Java 语言规范 (JLS) §15.28,编译时常量表达式仅由某些基本类型和文字组成,不包括对象 参考。在这种情况下,Foo.BAR 不是编译时常量表达式,因为它引用静态字段,该字段在运行时而不是编译时初始化。
解决问题:
要解决此问题,必须使用编译时常量初始化 Foo.BA* 变量表达式:
public abstract class Foo { ... public static final int BAR = 1; public static final int BAZ = 2; public static final int BAM = 3; ... }
使用这些初始化器,编译器可以在编译时确定 Foo.BA* 的值,使它们在 switch 语句中有效。
替代使用枚举的方法:
确保编译时常量值的另一个选项是使用枚举:
public enum FooConstants { BAR, BAZ, BAM }
但是,使用枚举会施加额外的限制,例如需要默认情况并禁止计算结果为表达式的情况标签。
以上是为什么我的 Java Switch 语句不接受抽象类中的静态常量?的详细内容。更多信息请关注PHP中文网其他相关文章!