java中枚举的定义及使用

枚举的定义

当类的对象时有限且固定的,如季节类,它只有春夏秋冬4个对象这种实例有限且固定的类,在 Java 中被称为枚举类;

定义:

1
2
3
public enum ElementType {
NODE, EDGE
}

这是java中的语法糖实际上会被编译成这样:

1
2
public class ElementType extends Enum<ElementType>{
}

所有的枚举类型都会默认继承 java.lang.Enum ,由于java中不支持多继承,所以枚举类型不能继承别的类,但是可以实现接口。

枚举和其他类一样可以有自己的域和方法:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public enum IndicatorRiskLevel {
/**
* 低
*/
LOW(1) {
@Override
public void hbaseColorRow(Put put) {
put.addColumn(RiskRuleColorRowMapper.COLOR_COLUMN, RiskRuleColorRowMapper.getColumnNameIsLow(), Bytes.toBytes(true));
}
},
MID(2) {
@Override
public void hbaseColorRow(Put put) {
put.addColumn(RiskRuleColorRowMapper.COLOR_COLUMN, RiskRuleColorRowMapper.getColumnNameIsMid(), Bytes.toBytes(true));
}
},
/**
* 高
*/
HIGH(3) {
@Override
public void hbaseColorRow(Put put) {
put.addColumn(RiskRuleColorRowMapper.COLOR_COLUMN, RiskRuleColorRowMapper.getColumnNameIsHigh(), Bytes.toBytes(true));

}
};
private int code;

public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}

IndicatorRiskLevel(int code) {
this.code = code;
}

public abstract void hbaseColorRow(Put put);
}

接口中使用枚举作为参数

在spring boot 中 controler层是用枚举作为参数传递,希望传入的是枚举对应的字符串,希望获得的是枚举对象

1
2
3
4
5
6

@GetMapping("/test")
public ResultData test(@RequestParam("para") @NotNull ElementType type) {
System.out.println(type);
return new ResultData(type);
}

定义一个 String 转换成Enum的转换器工厂

1
2
3
4
5
6
7
8
9
10
11
12
public class StringToEnumConverterFactory implements ConverterFactory<String, Enum> {
@Override
public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
return source -> {
if (Strings.isNotBlank(source)) {
return (T) Enum.valueOf(targetType, source);
} else {
return null;
}
};
}
}

配置转换器工厂到WebMvc

1
2
3
4
5
6
7
8
9
10
11
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Value("${spring.resources.static-locations}")
private String[] staticLocations;

@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverterFactory(new StringToEnumConverterFactory());
}
}

mybatis中使用枚举

与数据库交互时自动将枚举转与字符串(java.lang.Enum#name)或者数字(java.lang.Enum#ordinal)相互转化

添加enum转化配置

1
2
3
mybatis:
configuration:
default-enum-type-handler: org.apache.ibatis.type.EnumTypeHandler

使用这个org.apache.ibatis.type.EnumOrdinalTypeHandler这个是数字