当前位置: 首页 > 知识库问答 >
问题:

枚举值()方法效率

司徒高丽
2023-03-14

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

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

public enum Blah {

    private static final Blah [] _myValues = values()

    ...

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

}

共有2个答案

黎同
2023-03-14

是的,它效率很低,但还有另一种方法,成本也不高:

EnumSet.allOf(MyEnum.class);

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

蓝飞
2023-03-14

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

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

 类似资料:
  • 我有我的dll,它包含函数: 然后我得到例外: InnerException消息为“无效枚举值”\u 24170“无法反序列化为类型“MyEnum”。 我希望日志异常消息包含作为参数传递的字符串值,但不要包含一些不清楚的数字,如“\u 24170”。我该怎么做? 更新: 假设我有一个MyEnum,有三个值(一、二、三),当我传递到函数字符串“五”时,我想看到如下异常: 无效的枚举值“Five”无法

  • 枚举具有名为'hash value'的属性,该属性是枚举内的索引。

  • 问题内容: 因此,我对Java枚举中是否可以包含函数感到困惑。我正在制作一个简单的html编辑器,并希望使用枚举来表示html标签,是的,我知道这不是解决问题的最佳方法,而是我小组决定实现它的方法。 所以我一直在尝试做这样的事情,但是当我试图称其为静态方法时,我想我想知道这是否正确,或者是否有更好的方法来实现它而不是公开成为 问题答案: 是的,Java枚举可以具有功能。 http://docs.o

  • 问题内容: 我有几个使用下划线分隔单词的Java枚举。在我的每个枚举中,我都有一个toString方法,该方法实现为super.toString()。replace(“ _”,“”),这样我就可以在GUI上显示String值而没有下划线。有什么办法可以让我的所有枚举都使用此toString方法,而不必在所有这些枚举之间重复?如果这是一个常规类,答案很简单,实现toString()然后让我所有需要该

  • 问题内容: 我想声明一个枚举Direction,它具有一个返回相反方向的方法(以下语法不正确,即,不能实例化枚举,但它说明了我的观点)。这在Java中可行吗? 这是代码: 问题答案: 对于那些按标题吸引的人:是的,您可以在枚举中定义自己的方法。如果您想知道如何调用这种非静态方法,则可以使用与其他任何非静态方法相同的方法- 在定义或继承该方法的类型实例上调用它。如果是枚举,则此类实例仅为s。 因此,

  • 我试图构建一个通用方法,它将作为参数并处理一些信息。 但不幸的是,它不能像我希望的那样工作。也许你有一些建议来改进我的代码并防止错误。 我在调用: 无法在 我在和调用: 无法解析方法 无法解析方法 我需要在方法中使用的枚举都具有相同的结构。 例如,其中一个看起来像这样: 我知道我可以通过使用 但我的方法不会是通用的。我想对我的任何枚举使用此方法。