java - Enum#values() 是否在每次调用时分配内存?

标签 java memory-management enums

我需要将序数 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/

相关文章:

java - 可以使用保持插入顺序的迭代器进行排序的数据结构

java - 在 Java 中使用类(初学者)

c++ - 在C++中查找单个类的内存使用情况

enums - 定位枚举类型的最佳位置在哪里?

java - 单击按钮时我想显示一条 Toast 消息

java - 多个哈沙德数

java:54: 错误:需要类、接口(interface)或枚举,但构建失败并出现异常

java - Java 中的字符串枚举

C - 自由函数崩溃

java - 静态变量引用对象的垃圾回收