我想知道添加Enum一个静态 Holder 是否总是比“get”Enum 方法(或类似用于获取特定 Enum 值)上的迭代值更好的实现。
例如对于 Spring HttpStatus当前实现:
HttpStatus(int value, String reasonPhrase) {
this.value = value;
this.reasonPhrase = reasonPhrase;
}
public static HttpStatus valueOf(int statusCode) {
for (HttpStatus status : values()) {
if (status.value == statusCode) {
return status;
}
}
throw new IllegalArgumentException("No matching constant for [" + statusCode + "]");
}
可以通过以下方式优化:
private static class Holder {
private static Map<Integer, HttpStatus> enumMap = new HashMap<>();
}
HttpStatus(int value, String reasonPhrase) {
this.value = value;
this.reasonPhrase = reasonPhrase;
Holder.enumMap.put(value, this);
}
public static HttpStatus valueOf(int statusCode) {
return Holder.enumMap.computeIfAbsent(statusCode, statusCode -> {
throw new IllegalArgumentException("No matching constant for [" + statusCode + "]"); });
}
代码优化:
循环版本具有线性时间复杂度(每个获取值的请求),而使用 HashMap 的版本具有 O(1) 的时间复杂度。
这个优化是否有我遗漏的缺陷?
呼啦一阵风
DIEA
相关分类