You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 22:54:02