枚举值()方法效率

Sou*_*are 1 java enums

在多次调用特定枚举类的values()函数时是否存在效率低下的问题?

我已经看到了现有代码的实例,其中value()的结果被缓存以供重用.这有用吗?

public enum Blah {

    private static final Blah [] _myValues = values()

    ...

    public static Blah findBlahFromName(String name) {
        for (Blah blah : _myValues) {
            ...
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

Roh*_*ain 5

values()如果多次使用它,最好在枚举本身内缓存结果.那是因为,每次调用values()方法时,它都会创建一个新数组.所以,这确实不是必需的,因为你总是会得到相同的数组元素.

如注释中所述,共享一个缓存的数组将不是线程安全的,因为其他线程可以修改数组中的索引,因为它是可变的.一个选项是将元素包装在a中List<YourEnum>,并使用共享列表Collections.unmodifiableList().

  • 虽然与你不信任的人共享`values()`的缓存副本是不可行的,因为Java中的数组总是可变的,有人可以使用值的副本. (2认同)

Lou*_*man 5

是的,它效率低下,但还有另一种方法可以做到这一点,但成本却没有那么高:

EnumSet.allOf(MyEnum.class);
Run Code Online (Sandbox Code Playgroud)

EnumSet 具有与 JDK 的特殊连接,以允许它重用底层数组。