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

const val 相比 @JvmField val 具备哪些独有功能?

Kotlin中const val与@JvmField val的核心差异及独有能力

首先明确两者的本质定位:
const val是Kotlin原生的编译期常量声明关键字,@JvmField是JVM平台专属的注解,作用是取消Kotlin默认生成的字段getter/setter,直接将val暴露为JVM公有字段,两者的应用场景完全不同。


const val可实现但@JvmField val无法做到的操作

  • 编译期全局内联替换
    const val的取值会在编译阶段直接写入所有调用位置,不会生成任何字段访问逻辑。比如定义const val APP_VERSION = 2,所有调用APP_VERSION的代码编译后都会被直接替换为数值2。而@JvmField val本质仍是运行时字段,调用时始终要执行字段读取操作,无法实现编译期替换。

  • 可作为注解参数传入
    Kotlin/Java的注解参数要求必须是编译期常量,只有const val满足该要求。@JvmField val哪怕赋值固定,也无法作为注解参数使用,会直接触发编译错误。

  • 参与编译期常量表达式计算
    const val可以作为其他编译期常量的赋值源,所有计算逻辑会在编译阶段完成,比如:

const val BASE_COUNT = 10
const val EXTRA_COUNT = 5
const val TOTAL_COUNT = BASE_COUNT + EXTRA_COUNT // 编译后直接得到15

@JvmField val无法参与上述编译期计算,也不能作为其他const val的赋值来源,所有计算逻辑都会保留到运行时执行。

  • 不受运行时字段权限变更影响
    由于const val调用时完全不依赖原类的字段,哪怕后续修改const val的访问权限(比如从public改为private),已经编译完成的调用方代码仍可以正常运行。而@JvmField val如果修改访问权限,已编译的调用方会直接抛出IllegalAccessError。

两者其他核心差异

  • 声明限制不同:const val仅能声明在顶层、object类内部、companion object内部,且取值只能是基本类型或String,不能为自定义类型、可空类型;@JvmField val可以声明在普通类成员、类构造参数中,支持任意不可变类型。
  • 字节码特性不同:两者在字节码中都会生成public static final字段,但const val会额外携带编译期常量标记,@JvmField val无该标记,不会触发编译器的内联优化。

内容的提问来源于stack exchange,提问作者Ashish Dwivedi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:48:03