如何基于Java Enum各常量的Byte集合生成Map<Byte, MyEnum>
实现方案
核心思路:利用枚举类的静态初始化机制,在类加载阶段一次性构建映射表,后续查询时间复杂度为O(1),完全规避运行时遍历枚举的性能开销。
完整实现代码
public enum MyEnum { VALUE_1(1, (byte)0), VALUE_2(2, (byte)16), VALUE_3(3, (byte)17), VALUE_4(4, (byte)1), VALUE_5(5, (byte)116), VALUE_6(6, (byte)-59), VALUE_7(7, (byte)29), //... 其余40个枚举值 private final int faceIndex; private final byte byteIndex; private final Set<Byte> byteIndexPowerSet; // 静态只读映射表 private static final Map<Byte, MyEnum> BYTE_TO_ENUM_MAP; static { // 可根据所有枚举的powerSet总大小设置初始容量,避免扩容开销 BYTE_TO_ENUM_MAP = new HashMap<>(); for (MyEnum enumVal : MyEnum.values()) { for (Byte b : enumVal.byteIndexPowerSet) { // 可选冲突检测:避免不同枚举的powerSet出现重复byte导致逻辑错误,不需要可删除 if (BYTE_TO_ENUM_MAP.containsKey(b)) { throw new IllegalStateException(String.format( "Byte值[%d]重复出现在枚举[%s]和[%s]的powerSet中", b, BYTE_TO_ENUM_MAP.get(b), enumVal )); } BYTE_TO_ENUM_MAP.put(b, enumVal); } } } MyEnum(int faceIndex, byte byteIndex) { this.faceIndex = faceIndex; this.byteIndex = byteIndex; // 替换为你自己的幂集生成逻辑 this.byteIndexPowerSet = generatePowerSet(byteIndex); } // 对外暴露的高性能查询方法 public static MyEnum getByByte(Byte b) { return BYTE_TO_ENUM_MAP.get(b); } // 示例幂集生成方法,替换为你的实际实现 private static Set<Byte> generatePowerSet(byte byteIndex) { // 自定义逻辑 return Set.of(byteIndex); } // 原有getter方法按需保留 public int getFaceIndex() { return faceIndex; } public byte getByteIndex() { return byteIndex; } public Set<Byte> getByteIndexPowerSet() { return byteIndexPowerSet; } }
注意事项
- 原始伪代码中构造器第二个参数传入的是int类型,需要强转为
byte否则会触发编译错误,上述代码已经做了修正 - 如果业务允许不同枚举的powerSet存在重复byte,可删除冲突检测逻辑,后加载的枚举值会覆盖之前的映射
- 映射构建操作仅在类第一次加载时执行一次,运行时查询无额外开销,完全适配高频率调用场景
内容的提问来源于stack exchange,提问作者azagwen
相关产品推荐
相关产品推荐

