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

