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
相关产品推荐
相关产品推荐

