企业门户网站用户类型,window做网站的软件下载,建湖网站建设价格,游戏开发物语攻略万千封印我知道编译器需要在编译时知道表达式才能编译一个开关#xff0c;但是为什么foo.ba_常数不是呢#xff1f;虽然从字段初始化后执行的任何代码的角度来看#xff0c;它们都是常量#xff0c;但它们不是编译时间常数在JLS所要求的意义上#xff1b;见15.28常量表达式…万千封印我知道编译器需要在编译时知道表达式才能编译一个开关但是为什么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值、原始包装类型的值、装箱和取消装箱都被排除在外。