1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 通过属性值获取枚举对象 
@Getter
@AllArgsConstructor
@EnumMapping(value = "code")
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
@ApiModel("采样器运行状态")
public enum OperationStatus {

Running ("0", "待机"),
AutoSampling ("1", "自动采样中")

;

private String code;
private String desc;

public static OperationStatus getEnum(String code){
switch (code){
case "0":
return Running;
case "1":
return AutoSampling;
default:
return null;
}
}
}

枚举常量新增、删除、修改等都需要对该函数进行对应的修改,耦合非常高。

优化↓

1
2
3
4
5
6
7
8
public static OperationStatus getByCode(String code) {
for (OperationStatus operationStatus : OperationStatus.values()) {
if (operationStatus.code.equals(code)) {
return operationStatus;
}
}
return null;
}

通过这种改进,后面需要对枚举常量进行修改,该函数不需要改动。
但是每次获取枚举对象都要遍历一次枚举数组,时间复杂度是O(n)。

优化↓

1
2
3
4
5
6
7
8
9
private static final Map<String,OperationStatus> cache = new HashMap<>();
static {
for (OperationStatus operationStatus :OperationStatus.values()){
cache.put(operationStatus.getCode(),operationStatus);
}
}
public static OperationStatus getEnum(String code){
return cache.getOrDefault(code,null);
}

时间复杂度为 O(1),性能有所提升。
每个枚举类中都需要编写类似的代码,繁琐。
引入上述工具的枚举类,如果仅使用枚举常量,也会触发静态代码块的执行。