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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:51:31