【问题标题】:Spring HttpStatus.valueOf seems inefficient?Spring HttpStatus.valueOf 似乎效率低下?
【发布时间】:2020-04-23 03:49:27
【问题描述】:

Valueof 方法在代码上循环,这对我来说似乎效率低下。我错过了什么吗?
我正在使用 spring 4.2.5

    public static HttpStatus valueOf(int statusCode) {
        for (HttpStatus status : values()) {
            if (status.value == statusCode) {
                return status;
            }
        }
        throw new IllegalArgumentException("No matching constant for [" + statusCode + "]");
    }

【问题讨论】:

  • 只有大约 60 个枚举常量。与应用程序正在做的其他事情(例如网络)相比,执行循环所需的时间可能微不足道。也没有其他方法可以做到这一点。我想你可以试试地图,但我不知道那是否真的会更快——你需要分析/基准测试。

标签: java spring spring-boot spring-mvc


【解决方案1】:

我不确定你到底在问什么,但是与更高版本的 Spring 相比,有一些修改,但逻辑保持不变。

Spring 5.1.7 中看起来像这样 参考Git

    public static HttpStatus valueOf(int statusCode) {
        HttpStatus status = resolve(statusCode);
        if (status == null) {
            throw new IllegalArgumentException("No matching constant for [" + statusCode + "]");
        }
        return status;
    }


    @Nullable
    public static HttpStatus resolve(int statusCode) {
        for (HttpStatus status : values()) {
            if (status.value == statusCode) {
                return status;
            }
        }
        return null;
    }

【讨论】:

  • 这里的resolve 方法看起来像是OP 的valueOf 方法的反编译版本。换句话说,版本之间并没有真正改变。他们添加了一个resolve 方法,该方法在找不到常量时返回 null 而不是抛出异常,否则搜索代码完全相同。
【解决方案2】:

你的困惑是什么?你可以问我 。 foreach in values() ,当 statusCode 等于 打破循环并返回。

【讨论】:

    最近更新 更多