Scala中3600L*24这类常量表达式会在编译期完成计算吗
Scala常量计算阶段问题解答
你给出的示例代码如下:
val oneDay = 3600L * 24 // seconds in one day val twoDay = oneDay * 2 // seconds in two days
变量oneDay的计算阶段
oneDay的赋值右侧是两个字面量常量的乘法运算,属于Scala编译器可识别的常量表达式,会触发编译器的常量折叠优化,86400L这个结果会在编译期直接计算完成,写入最终生成的字节码文件中,运行时不需要再执行乘法运算。
变量twoDay的计算阶段
默认无特殊修饰的情况下,普通val定义的oneDay不会被识别为编译期常量(因为非final的类成员val允许子类重写,编译器无法全局确认其值固定),因此oneDay * 2的运算会在类加载的初始化阶段完成,属于运行期范畴。
如果给oneDay加上final修饰,如下:
final val oneDay = 3600L * 24
此时oneDay会被编译器判定为编译期常量,twoDay的乘法运算也会触发常量折叠,改为在编译期完成计算。
你可以通过javap -c 编译后的类名命令反编译字节码,直接查看实际的运算逻辑验证上述结论。
内容的提问来源于stack exchange,提问作者Jus12
相关产品推荐
相关产品推荐

