EnumClass.values()在Kotlin中如何工作?

EnumClass.values()在Kotlin中如何工作?,kotlin,Kotlin,EnumClass.values()如何在Kotlin中工作 我的意思是,它是否每次都会创建新的数组,或者它是静态的,或者其他什么?虽然不是100%确定,但我假设在Kotlin(以及Java)中Enum.values()方法是由编译器生成的: 编译器在创建时会自动添加一些特殊方法 枚举。例如,它们有一个静态值方法,该方法返回 按顺序包含枚举的所有值的数组 宣布。此方法通常与 为每个构造迭代枚举类型的值 从: 此方法每次都返回新数组 关键是在Java中数组不能是常量:它的值可以修改,因此您不能共

EnumClass.values()
如何在Kotlin中工作


我的意思是,它是否每次都会创建新的
数组
,或者它是静态的,或者其他什么?

虽然不是100%确定,但我假设在Kotlin(以及Java)中
Enum.values()
方法是由编译器生成的:

编译器在创建时会自动添加一些特殊方法 枚举。例如,它们有一个静态值方法,该方法返回 按顺序包含枚举的所有值的数组 宣布。此方法通常与 为每个构造迭代枚举类型的值

从:


此方法每次都返回新数组

关键是在Java中数组不能是常量:它的值可以修改,因此您不能共享同一个数组,并且必须在每次访问时提供一个新的数组,以确保数组没有被更改

简单测试:

enum class MyEnum { CAT, DOG }

val a = MyEnum.values()
val b = MyEnum.values()

println("${a === b}") // >>> false

a[0] = MyEnum.DOG
println(a.joinToString())               // >>> [DOG, DOG]
println(MyEnum.values().joinToString()) // >>> [CAT, DOG]

实际上,我还认为它在这里使用了与Java相同的枚举机制,然后当返回数组时,数组将被克隆。这不完全是重复的(因为它在这里处理Kotlin)。但是使用
javap
打印字节码,我们知道
java.lang.Enum
是在后台使用的。因此,科特林也是如此。
enum class MyEnum { CAT, DOG }

val a = MyEnum.values()
val b = MyEnum.values()

println("${a === b}") // >>> false

a[0] = MyEnum.DOG
println(a.joinToString())               // >>> [DOG, DOG]
println(MyEnum.values().joinToString()) // >>> [CAT, DOG]