java枚举本身不支持位运算,需通过语义化枚举+整数掩码桥接实现多选权限控制:每个枚举值对应唯一2的幂(如1

Java 枚举类本身不支持位运算,但可以通过语义化定义 + 整数掩码桥接,实现多选权限控制。关键不是让枚举“会算”,而是用枚举管名字、用整数管位操作,再用封装把两者自然串起来。
给每个权限分配唯一二进制位
每个枚举常量对应一个 2 的幂值(即只有一位是 1),确保按位组合互不干扰:
- 用 1 形式定义,比手写 1/2/4/8 更清晰、安全、易扩展
- 顺序不重要,但值必须唯一且为 2 的幂;重复或非幂值会导致位冲突,判断失效
- 示例写法:
public enum Permission {
READ(1 WRITE(1 DELETE(1 EXECUTE(1 private final int mask;
Permission(int mask) { this.mask = mask; }
public int getMask() { return mask; }
}
用整数变量承载多个权限组合
不再用 Set
-
组合权限:用 | 连接,如
int perms = READ.getMask() | WRITE.getMask();→ 值为 3(0b0011) -
检查权限:用 & 判断,如
(perms & READ.getMask()) != 0 -
添加权限:用 |=,如
perms |= EXECUTE.getMask(); -
移除权限:用 & ~,如
perms &= ~DELETE.getMask();
封装一层提升可读性与安全性
直接传 int 掩码容易误用,建议加一层类型包装:
- 定义 PermissionSet 类,内部持
int mask,对外提供has(Permission)、add(Permission)、remove(Permission)等方法 - 或在枚举中补充静态工厂方法,如
PermissionSet.of(READ, WRITE),返回不可变对象 - 避免裸露 int 类型参数,防止非法位被意外置 1(比如传入 5 而非预定义掩码)
替代方案:用 EnumSet 更简洁安全
如果不需要极致内存压缩或跨系统位兼容,EnumSet 是更推荐的默认选择:
- 无需手动赋幂值,直接按声明顺序自动映射位(
READ→ bit 0,WRITE→ bit 1…) - 语义清晰:
EnumSet.of(READ, WRITE)比3更易懂 - 底层仍是位运算,性能不打折,还自带
contains()、retainAll()、complementOf()等集合操作 - 类型安全,编译期防错,IDE 可自动补全和跳转
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











