首页 >Java >java教程 >为什么我的 Java Switch 语句不接受抽象类中的静态常量?

为什么我的 Java Switch 语句不接受抽象类中的静态常量?

Patricia Arquette
Patricia Arquette原创
2024-12-19 21:29:13976浏览

Why Doesn't My Java Switch Statement Accept Static Constants from an Abstract Class?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn