enumset.allof创建含全部枚举常量的集合,enumset.noneof创建空集合;二者均为类型安全的静态工厂方法,依赖枚举class参数,内部采用位向量优化,不可new实例且禁止null元素。

EnumSet.allOf 和 EnumSet.noneOf 是 Java 中初始化 EnumSet 最基础、最常用的两种静态工厂方法,它们不依赖构造函数(因为 EnumSet 是抽象类,无法直接 new),而是通过类型安全、高性能的方式创建集合。
EnumSet.allOf(Class elementType):一次性包含全部枚举值
这个方法会创建一个包含该枚举类**所有常量**的 `EnumSet`,内部采用位向量(bit vector)一次性置位,效率远高于循环添加。
适用场景:需要默认启用所有选项、做全量校验、或作为初始基准集进行后续排除操作(比如权限全开后逐步禁用)。
- 参数必须是枚举类型的 Class 对象,例如 Day.class、Status.class
- 返回的集合是可变的,支持 add/remove 等操作
- 元素顺序严格按枚举声明顺序排列
示例:
EnumSet// 假设 Status 有 ACTIVE, INACTIVE, PENDING, DELETED → 集合包含全部4个
EnumSet.noneOf(Class elementType):创建空集合,按需填充
这个方法返回一个**空的 `EnumSet`**,但已明确指定其元素类型。它不包含任何枚举实例,是后续调用 add() 或 retainAll() 等操作的理想起点。
适用场景:初始化后动态添加、条件筛选构建、或作为“无默认值”的安全起始状态(避免 null 集合)。
- 同样要求传入枚举类的 Class 对象
- 底层根据枚举常量数量自动选择 RegularEnumSet(≤64 个)或 JumboEnumSet(>64 个)实现
- 比 new HashSet() 更省内存、更快,且类型强约束
示例:
EnumSetworkdays.add(Day.MONDAY);
workdays.add(Day.TUESDAY);
// 最终只含 MONDAY 和 TUESDAY
注意点:不能混用、不可 null
`EnumSet` 不允许 null 元素,传入 null 类型(如 `null.class`)或非枚举类会抛出 `ClassCastException` 或 `NullPointerException`。
- 确保传入的是真正的 enum 类,不是普通 class
- 两个方法都要求泛型与实际枚举类型一致,编译期即检查
- 不要试图用 `new EnumSet()` —— 编译不通过
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











