You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:49:05