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

Kotlin枚举类属性加载机制疑问:枚举实例属性是否懒加载?

Kotlin枚举类中属性实例的初始化时机

嘿,这个问题问得很关键!咱们直接给结论:你的枚举类里的两个MyObjectType实例,会在枚举类本身被JVM加载的时候就立刻创建,完全不是懒加载的方式。

为啥会这样?其实Kotlin的枚举类底层实现和Java是对齐的——枚举常量本质上是枚举类的静态成员变量。当JVM第一次加载MyEnum这个类的时候,所有枚举常量(也就是ONE和TWO)都会被依次初始化,它们构造函数里传入的参数(也就是MyObjectType(blabla))也会同步执行,直接创建对应的实例。

咱们可以用一段测试代码验证这个行为:

class MyObjectType(val desc: String) {
    init {
        println("MyObjectType实例已创建:$desc")
    }
}

enum class MyEnum(var sampleObject: MyObjectType) {
    ONE(MyObjectType("对应ONE的实例")),
    TWO(MyObjectType("对应TWO的实例"))
}

fun main() {
    println("准备访问MyEnum...")
    val targetEnum = MyEnum.ONE
}

运行这段代码,你会看到输出顺序是这样的:

MyObjectType实例已创建:对应ONE的实例
MyObjectType实例已创建:对应TWO的实例
准备访问MyEnum...

看到没?还没等我们在main里访问MyEnum,两个MyObjectType实例就已经被创建了。

如果你的需求是要让这些实例懒加载(也就是第一次访问枚举常量的sampleObject属性时才创建),可以用Kotlin的lazy委托来实现,调整一下枚举类的结构:

enum class MyEnum {
    ONE, TWO;

    // 用lazy委托实现懒加载
    val sampleObject by lazy {
        MyObjectType(when(this) {
            ONE -> "对应ONE的懒加载实例"
            TWO -> "对应TWO的懒加载实例"
        })
    }
}

这样修改后,只有当你第一次调用MyEnum.ONE.sampleObject的时候,对应的MyObjectType实例才会被创建,完美实现懒加载效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:18:19