如何通过 EnumSet.allOf() 方法高效获取 Java 枚举类所有常量集合?
- 内容介绍
- 文章标签
- 相关推荐
本文共计878个文字,预计阅读时间需要4分钟。
`EnumSet.allOf()` 方法只能用于枚举类型,且必须传入该枚举的 `Class` 对象。它底层依赖于枚举类的 `values()` 方法。因此,要求枚举类型不能是匿名子类或动态生成的(如反射构造的)。否则,会抛出 `IllegalArgumentException`。
- 必须传入具体枚举类的
Class,例如Color.class,不能传Object.class或父类 - 枚举类中不能有未初始化的字段(如在
static块中抛异常),否则allOf()调用时可能触发ExceptionInInitializerError - 返回的是不可变结构但可变内容的集合——你不能
add()或remove(),但可以clear()(清空后集合变空,不再是“全量”)
为什么不用 values() 直接转 List 而要用 EnumSet.allOf()?
EnumSet 是专门为枚举设计的高性能集合实现,底层用位向量(long 或 long[])表示,空间占用极小、遍历和 contains 操作都是 O(1)。而 Arrays.asList(Color.values()) 返回的是固定大小的 ArrayList,既不支持增删,又没做位运算优化。
本文共计878个文字,预计阅读时间需要4分钟。
`EnumSet.allOf()` 方法只能用于枚举类型,且必须传入该枚举的 `Class` 对象。它底层依赖于枚举类的 `values()` 方法。因此,要求枚举类型不能是匿名子类或动态生成的(如反射构造的)。否则,会抛出 `IllegalArgumentException`。
- 必须传入具体枚举类的
Class,例如Color.class,不能传Object.class或父类 - 枚举类中不能有未初始化的字段(如在
static块中抛异常),否则allOf()调用时可能触发ExceptionInInitializerError - 返回的是不可变结构但可变内容的集合——你不能
add()或remove(),但可以clear()(清空后集合变空,不再是“全量”)
为什么不用 values() 直接转 List 而要用 EnumSet.allOf()?
EnumSet 是专门为枚举设计的高性能集合实现,底层用位向量(long 或 long[])表示,空间占用极小、遍历和 contains 操作都是 O(1)。而 Arrays.asList(Color.values()) 返回的是固定大小的 ArrayList,既不支持增删,又没做位运算优化。

