我需要将序数 int
值转换为 Java 中的枚举值。很简单:
MyEnumType value = MyEnumType.values()[ordinal];
values()
方法是隐式的,我找不到它的源代码,因此提出了问题。
MyEnumType.values()
是否分配新数组?如果是这样,我应该在第一次调用时缓存数组吗?假设转换会被非常频繁地调用。
最佳答案
是的。
Java 没有让我们创建不可修改数组的机制。因此,如果 values()
将返回相同的可变数组,我们就有可能有人为每个人更改其内容。
因此,在将不可修改的数组引入 Java 之前,为了安全起见,values()
必须返回包含所有值的新/单独数组。
我们可以用 ==
操作符来测试它:
MyEnumType[] arr1 = MyEnumType.values();
MyEnumType[] arr2 = MyEnumType.values();
System.out.println(arr1 == arr2); //false
如果你想避免重新创建这个数组,你可以简单地存储它并在以后重用 values()
的结果。有几种方法可以做到这一点,比如。
您可以创建私有(private)数组并仅允许通过 getter 方法访问其内容,例如
private static final MyEnumType[] VALUES = values();// to avoid recreating array MyEnumType getByOrdinal(int){ return VALUES[int]; }
您可以将
values()
的结果存储在像List
这样的不可修改集合中,以确保其内容不会被更改(现在这样的列表可以公开) .public static final List<MyEnumType> VALUES = Collections.unmodifiableList(Arrays.asList(values()));
关于java - Enum#values() 是否在每次调用时分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32799282/