Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 枚举值()方法的效率_Java_Enums - Fatal编程技术网

Java 枚举值()方法的效率

Java 枚举值()方法的效率,java,enums,Java,Enums,多次调用特定枚举类的values()函数是否效率低下? 我见过一些现有代码的实例,其中values()的结果被缓存以供重用。这有用吗 public enum Blah { private static final Blah [] _myValues = values() ... public static Blah findBlahFromName(String name) { for (Blah blah : _myValues) {

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

我见过一些现有代码的实例,其中values()的结果被缓存以供重用。这有用吗

public enum Blah {

    private static final Blah [] _myValues = values()

    ...

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

}

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


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

是的,这样做效率很低,但有另一种方法成本不高:

EnumSet.allOf(MyEnum.class);

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

尽管与您不信任的人共享
值()的缓存副本是不合适的,因为Java中的数组总是可变的,有人可以摆弄值的副本。或者只使用[
Enum.valueOf
](,Java.lang.String%29)如果您知道枚举的名称。我认为创建一个新数组的成本对于大多数代码来说是可以忽略不计的。@chrylis选项
集合。不可修改列表(..)
包装器可以解决这个问题,但是
for(:)
循环将创建迭代器,这与使用数组时不同。
EnumSet.allOf(MyEnum.class)
可能比这些选项简单得多,并且只使用常量内存(您已经用
迭代器购买了它)。值得一提的是,在这种特殊情况下,我倾向于使用番石榴
ImmutableMap
,因为它可以安全地共享,可以包装,使用IMO稍微简单一点。您可以确切地看到如何检索这些缓存,这里称为微优化。除非枚举真的成为应用程序中的瓶颈。