【问题标题】:How to get number of possible items of an Enum?如何获取枚举的可能项目数?
【发布时间】:2013-07-05 15:13:12
【问题描述】:

有没有一种内置的方法来获取 Enum 的项目数,例如 Myenum.length

或者我是否必须自己实现一个函数int size() 硬编码元素的数量?

【问题讨论】:

  • 你说的是枚举还是枚举?这些不一样。
  • 正在谈论枚举。问题是法语枚举是“枚举”的简写。(就像我倾向于认为的英语)。所以不是在说界面。
  • 我添加了 Kotlin 标签可以吗?我在 Google 上搜索了一个 Kotlin 解决方案,结果到了这里。
  • 另见 this youtrack issue,它提出了 Kotiln 中 Enum.values() 的高性能替代方案。

标签: java kotlin enums


【解决方案1】:

是的,您可以使用Enum.values() 方法获取枚举值数组,然后使用length 属性。

public class Main {
    enum WORKDAYS { Monday, Tuesday, Wednesday, Thursday, Friday; }

    public static void main(String[] args) {
        System.out.println(WORKDAYS.values().length);
        // prints 5
    }
}

http://ideone.com/zMB6pG

【讨论】:

  • Enum.values() 每次都会分配一个新数组,因此不建议用于高调用率(即 for 循环条件)。如果您需要经常调用它,请缓存该值。
  • @MarkJeronimus 即使不经常调用它,这仍然是不好的做法。只为长度属性分配一个数组是愚蠢的,即使只做了一次。
  • @Hatefiend 你有什么建议?
【解决方案2】:

您可以使用Myenum.values().length获取长度

Enum.values() 返回一个包含所有 enum 常量的数组。你可以使用这个数组的length变量来获取enum常量的个数。

假设你有以下枚举:

public enum Color
{
    BLACK,WHITE,BLUE,GREEN,RED
}

以下语句会将 5 分配给 size

int size = Color.values().length;

【讨论】:

  • length 不是数组的方法,它是一个属性字段,所以你可以不带括号使用它。
  • @CyrilleKa:感谢您的通知。更正了它。 :)
【解决方案3】:

enum.values() 方法由 Java 编译器添加,API 中未提及。

Where is the documentation for the values() method of Enum?

【讨论】:

    【解决方案4】:

    为了避免每次调用values()方法:

    public class EnumTest {
    
        enum WORKDAYS {
           Monday,
           Tuesday,
           Wednesday,
           Thursday,
           Friday;
    
           public static final int size;
           static {
              size = values().length;
           }
       }
    
    
       public static void main(String[] args) {
          System.out.println(WORKDAYS.size); // 5
       }
    }
    

    【讨论】:

      【解决方案5】:

      MyEnum.values() 将枚举常量作为数组返回。

      所以你可以使用:

      int size = MyEnum.values().length
      

      【讨论】:

        【解决方案6】:

        我搜索了一个 Kotlin 答案并弹出了这个问题。所以,这是我的答案。

        enum class MyEnum { RED, GREEN, BLUE }
        MyEnum.values().size // 3
        

        这是另一种方法:

        inline fun <reified T : Enum<T>> sizeOf() = enumValues<T>().size
        sizeOf<MyEnum>() // 3
        

        感谢 Miha_x64 this answer

        【讨论】:

        • 参见this Kotlin issue,旨在用更现代、更高效的替代方案取代Enum.values()
        猜你喜欢
        • 2018-11-02
        • 2010-11-30
        • 2011-01-21
        • 1970-01-01
        • 2013-08-09
        • 1970-01-01
        • 1970-01-01
        • 2019-04-19
        相关资源
        最近更新 更多