gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:22:16 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com