2

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

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

public enum Blah {

    private static final Blah [] _myValues = values()

    ...

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

}
4

2 回答 2

6

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

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

于 2013-10-10T18:33:40.693 回答
5

是的,它效率低下,但还有另一种方法可以做到这一点,它几乎没有那么昂贵:

EnumSet.allOf(MyEnum.class);

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

于 2013-10-10T19:09:26.347 回答