EnumSet.allOf() 是创建包含枚举全部常量集合的首选方式,因其利用编译期已知特性、位向量实现、零装箱、线程安全且自动适配新增常量。

EnumSet.allOf() 是 Java 中高效创建“包含某枚举类全部常量”的集合的首选方式,比手动遍历或逐个添加更简洁、更安全、性能也更好。
为什么用 allOf() 而不是其他方式?
它直接利用枚举类的编译期已知特性(所有枚举常量在类加载时就确定),内部采用位向量(bit vector)实现,空间占用小、操作极快。相比 new ArrayList() 或 Stream.of(...).collect(),它零装箱、无迭代开销、不可变结构天然线程安全(返回的是不可修改视图)。
基本用法:一行搞定全量集合
只需传入枚举类的 Class 对象:
enum Color { RED, GREEN, BLUE }
Set<Color> allColors = EnumSet.allOf(Color.class); // 包含 RED, GREEN, BLUE
注意:allOf() 返回的是 EnumSet 实例,是 Set 的子类型,支持所有标准 Set 操作(如 contains、remove、retainAll),但不支持 null 元素——这和枚举本身语义一致。
使用前提与限制
- 参数必须是非空的枚举类 Class 对象;传入 null 或非枚举类会抛
NullPointerException或ClassCastException - 不能用于匿名枚举或局部枚举(Java 不允许)
- 若枚举类后续新增常量,
allOf()结果会自动包含,无需改代码——这是它的动态适应优势
对比其他常见创建方式
-
EnumSet.of(E1, E2, ...):适合明确指定几个值,不适合“全量”场景 -
EnumSet.complementOf(set):需先有一个子集,再取补集,多一步且易出错 - 循环 + add():冗长、低效、可能误加 null 或非枚举值

















