如何实现ScopeItems枚举数组与整数值的双向转换?
嘿,这个需求其实用**位掩码(Bitmask)**的思路就能优雅解决,正好Java枚举天生适配这种“多组合/拆分”的场景!我给你整理了一套简洁又易扩展的实现方案:
第一步:改造枚举,内置位掩码属性
首先给ScopeItems每个枚举值分配一个2的幂次作为位掩码(用1 << n的方式,n从0开始递增,避免手动算错),同时封装转换逻辑:
import java.util.Arrays; import java.util.HashSet; import java.util.Set; public enum ScopeItems { BASIC_INFO(1 << 0), // 对应二进制001,十进制1 POLICY_INFO(1 << 1), // 对应二进制010,十进制2 USER_INFO(1 << 2); // 对应二进制100,十进制4 private final int mask; // 构造方法初始化掩码 ScopeItems(int mask) { this.mask = mask; } public int getMask() { return mask; } // 功能1:将ScopeItems集合转换为对应整数 public static int toMask(Set<ScopeItems> scopes) { int resultMask = 0; for (ScopeItems scope : scopes) { resultMask |= scope.mask; // 按位或运算,累加组合掩码 } return resultMask; } // 重载:支持可变参数,调用更灵活 public static int toMask(ScopeItems... scopes) { return toMask(new HashSet<>(Arrays.asList(scopes))); } // 功能2:将整数反向转换为ScopeItems集合 public static Set<ScopeItems> fromMask(int mask) { Set<ScopeItems> scopes = new HashSet<>(); for (ScopeItems scope : values()) { // 按位与运算,判断当前枚举是否在掩码中 if ((mask & scope.mask) != 0) { scopes.add(scope); } } return scopes; } }
第二步:使用示例
- 集合转整数:比如传入
[POLICY_INFO, USER_INFO]
int mask = ScopeItems.toMask(Set.of(ScopeItems.POLICY_INFO, ScopeItems.USER_INFO)); // 输出结果:6(二进制010 | 100 = 110,对应十进制6)
- 整数转集合:比如传入5
Set<ScopeItems> scopes = ScopeItems.fromMask(5); // 输出结果:[BASIC_INFO, USER_INFO](二进制101,对应001 + 100)
为什么这个方案更优?
- 简洁高效:利用位运算(
|和&)天然适配组合/拆分场景,比手动判断枚举组合的逻辑快得多,代码量也少 - 扩展性极强:以后新增ScopeItems时,只需要加一行
NEW_SCOPE(1 << 3),完全不用修改转换逻辑 - 封装性好:转换逻辑完全封装在枚举内部,Auth对象只需要调用静态方法即可,业务代码更整洁
内容的提问来源于stack exchange,提问作者user7862512
相关产品推荐
相关产品推荐

