如何让Java枚举对应区间类型而非单个整数类型?
实现区间匹配的Java枚举方案
原枚举代码存在构造函数名错误(构造函数名应与枚举名一致,即Behavior而非BehaviorCode),修正基础问题后,我们可以通过为枚举项添加区间属性、封装匹配逻辑的方式,实现按区间映射行为的需求,完全无需大量if-else嵌套。
通用区间匹配枚举实现
这种方案支持自定义每个区间的开闭规则,灵活性更高:
public enum Behavior { CRY(0, 1, false, true), // [0,1):包含左边界,不包含右边界 SAD(1, 2, false, true), // [1,2) NORMAL(2, 3, false, true), // [2,3) FUNNY(3, 4, true, false), // (3,4]:不包含左边界,包含右边界 SMILE(4, 5, false, false); // [4,5]:包含左右边界 private final double lowerBound; private final double upperBound; private final boolean excludeLower; private final boolean excludeUpper; // 构造函数:传入区间上下界,以及是否排除左右边界 Behavior(double lowerBound, double upperBound, boolean excludeLower, boolean excludeUpper) { this.lowerBound = lowerBound; this.upperBound = upperBound; this.excludeLower = excludeLower; this.excludeUpper = excludeUpper; } // 判断当前枚举项是否匹配给定值 private boolean matches(double x) { boolean lowerCheck = excludeLower ? x > lowerBound : x >= lowerBound; boolean upperCheck = excludeUpper ? x < upperBound : x <= upperBound; return lowerCheck && upperCheck; } // 静态方法:根据值匹配对应的Behavior枚举项 public static Behavior fromValue(double x) { for (Behavior behavior : values()) { if (behavior.matches(x)) { return behavior; } } // 处理超出区间的情况,可抛出异常或返回默认值 throw new IllegalArgumentException("No matching behavior for value: " + x); } }
简化版实现(针对统一区间规则)
如果你的区间规则是统一的(比如前四个区间为左闭右开,最后一个为左闭右闭),可以省略开闭标记,进一步简化代码:
public enum Behavior { CRY(0, 1), SAD(1, 2), NORMAL(2, 3), FUNNY(3, 4), SMILE(4, 5); private final double lowerBound; private final double upperBound; Behavior(double lowerBound, double upperBound) { this.lowerBound = lowerBound; this.upperBound = upperBound; } private boolean matches(double x) { // 普通区间左闭右开,最后一个区间左闭右闭 if (this == SMILE) { return x >= lowerBound && x <= upperBound; } return x >= lowerBound && x < upperBound; } public static Behavior fromValue(double x) { for (Behavior behavior : values()) { if (behavior.matches(x)) { return behavior; } } throw new IllegalArgumentException("No matching behavior for value: " + x); } }
使用示例
在业务代码中只需一行即可完成匹配:
// 匹配(3,4]区间的3.5,返回FUNNY Behavior behavior1 = Behavior.fromValue(3.5); // 匹配[4,5]区间的4.0,返回SMILE Behavior behavior2 = Behavior.fromValue(4.0);
这种方案将区间匹配逻辑完全封装在枚举内部,外部调用简洁易懂,后续修改区间规则或新增枚举项时,仅需修改枚举类即可,维护性远高于分散的if-else代码。
内容的提问来源于stack exchange,提问作者user21193451
相关产品推荐
相关产品推荐

