EnumClass.values()
如何在Kotlin工作?
我的意思是它每次都会创建新的Array
,还是懒惰的静态评估,还是别的什么?
答案 0 :(得分:2)
虽然不是100%肯定,但我认为在 Kotlin (以及 Java )Enum.values()
方法是由编译器生成的:
编译器在创建时会自动添加一些特殊方法 一个枚举。例如,他们有一个返回an的静态值方法 包含枚举的所有值的数组 声明。这种方法通常与之结合使用 for-each构造迭代枚举类型的值。
来自JLS:
/**
* Returns an array containing the constants of this enum
* type, in the order they're declared. This method may be
* used to iterate over the constants as follows:
*
* for(E c : E.values())
* System.out.println(c);
*
* @return an array containing the constants of this enum
* type, in the order they're declared
*/
public static E[] 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]