如何实现更具可读性的三枚举剩余值查找方法?
优化EnumABC获取剩余枚举值的方案
针对你当前用if-elseif-else实现的逻辑,这里提供几个更具可读性和可维护性的优化方案:
方案一:利用集合差集操作
这种方法逻辑直观,通过集合的移除操作直接得到剩余枚举值,无需复杂的条件判断。
public enum EnumABC { A, B, C; public static EnumABC getRemaining(EnumABC first, EnumABC second) { if (first == second) { throw new IllegalArgumentException("输入的两个枚举值必须不同"); } Set<EnumABC> allValues = EnumSet.allOf(EnumABC.class); allValues.remove(first); allValues.remove(second); return allValues.iterator().next(); } }
优势:代码简洁,逻辑清晰,即使后续枚举值有调整(只要数量还是3个),核心逻辑无需修改。
方案二:基于数值总和的运算
如果给枚举值分配了连续的整数(比如A=1、B=2、C=3),可以利用总和减去两个输入值的方式快速得到结果。
public enum EnumABC { A(1), B(2), C(3); private static final int TOTAL_SUM = 6; // 1+2+3的总和 private final int value; EnumABC(int value) { this.value = value; } public static EnumABC getRemaining(EnumABC first, EnumABC second) { if (first == second) { throw new IllegalArgumentException("输入的两个枚举值必须不同"); } int remainingValue = TOTAL_SUM - first.value - second.value; // 反向查找对应枚举 for (EnumABC e : EnumABC.values()) { if (e.value == remainingValue) { return e; } } throw new IllegalStateException("无法匹配到剩余枚举值"); } }
优势:运算效率高,适合对性能有轻微要求的场景,代码同样无需大量条件判断。
方案三:预定义组合映射表
直接把所有合法的输入组合与结果一一映射,逻辑完全透明,可读性拉满,维护时一目了然。
public enum EnumABC { A, B, C; private static final Map<Set<EnumABC>, EnumABC> PAIR_RESULT_MAP = Map.of( Set.of(A, B), C, Set.of(A, C), B, Set.of(B, C), A ); public static EnumABC getRemaining(EnumABC first, EnumABC second) { if (first == second) { throw new IllegalArgumentException("输入的两个枚举值必须不同"); } EnumABC result = PAIR_RESULT_MAP.get(Set.of(first, second)); if (result == null) { throw new IllegalStateException("无效的枚举组合"); } return result; } }
优势:每个输入组合对应的结果清晰可见,排查问题或修改逻辑时无需梳理复杂的条件分支,最适合需要高可读性的场景。
内容的提问来源于stack exchange,提问作者ATalkingMonkey
相关产品推荐
相关产品推荐

