java 常量表达式_JavaSwitch语句:常量表达式是必需的,但它是常量

4d6cc336c9e9561e61e54a5d96a27976.png

万千封印

我知道编译器需要在编译时知道表达式才能编译一个开关,但是为什么foo.ba_常数不是呢?虽然从字段初始化后执行的任何代码的角度来看,它们都是常量,但它们不是编译时间常数在JLS所要求的意义上;见§15.28常量表达式的规格常数表达式1..这指的是§4.12.4最后变量它将“常量变量”定义为:我们称一个变量为原始类型或类型字符串,它是最终变量,并使用编译时常量表达式(§15.28)初始化为常量变量。变量是否为常量变量可能涉及类初始化(§12.4.1)、二进制兼容性(§13.1,§13.4.9)和确定赋值(§16)。在您的示例中,foo.ba*变量没有初始化器,因此不限定为“常量变量”。修复很简单;将foo.ba*变量声明更改为具有编译时常量表达式的初始化器。在其他示例中(初始化器已经是编译时常量表达式),将变量声明为final可能是我们需要的。可以将代码更改为使用enum而不是int常量,但这又带来了几个不同的限制:你,你们必包括default即使你有case的每一个已知值enum;见为什么打开枚举的开关是必需的?这个case标签必须是显式的enum值,而不是计算为enum价值。1-常量表达限制可概括如下。常量表达式a)可以使用原语类型和String只有,b)允许文字的初等(除了null)和常量变量,c)允许常量表达式(可能括号为子表达式),d)允许运算符(赋值运算符除外),++, --或instanceof,和e)允许将类型转换为原始类型或String只有。注意,这不包括任何形式的方法或lambda调用,new, .class. .length或数组订阅。此外,数组值的任何使用,enum值、原始包装类型的值、装箱和取消装箱都被排除在外。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值