前言
很多表示分类的数据在数据库或者在前端都会通过数字代码来表示,比如界面上表示男、女的radio,显示城市的下拉框,公司的仪器分类,每种类别在数据库中都是通过对应的数字来进行表示,最开始在后端可以通过静态字符串常量来表示一种类型,但不够灵活,后面出现的枚举,内部可以自定义方法,而且还可以定义实例方法,即方便,可读性也好。
Enum的使用
1、enum的定义
public enum Color {
RED,
BLUE,
BLACK
}
枚举的使用:
/**
*
* values():返回 enum 实例的数组,而且该数组中的元素严格保持在 enum 中声明时的顺序。
* name():返回实例名。类型是String
* ordinal():返回实例声明时的次序,从0开始计数,这个方法我们基本不使用,当初设计时是供EnumSet和EnumMap使用
* getDeclaringClass():返回实例所属的 enum全类名。
* equals() :判断是否为同一个对象。也可用 == 来进行判断
*/
for(Color color : Color.values()){ // RED
System.out.println(color); // BLUE
} // BLACK
Color color = Color.BLACK;
System.out.println(color.name()); // BLACK
System.out.println(color.ordinal()); // 2
System.out.println(color.getDeclaringClass()); // class com.tx.enums.test$Color
Color color2 = Color.RED;
System.out.println(color.equals(color2)); // false
2、实例有自定义映射关系的枚举
在定义时,需要实例在前,
/**
* 自定义编号时,必须定义有参构造
* 实例中的参数位置跟有参构造的参数类型顺序是一致的,不一致则会报错
* 需要getter,因为可能需要显示描述信息, 不需要setter,因为枚举实例不能通过new来新建实例,也不需要空参构造器
*/
public enum SizeEnum {
BIG(1, "大尺寸"),
NORMAL(2, "正常尺寸"),
SMALL(3, "小尺寸");
private int num;
private String detail;
public int getNum() {
return num;
}
public String getDetail() {
return detail;
}
SizeEnum(int num, String detail) {
this.num = num;
this.detail = detail;
}
// 一般前端传到后端,或者从数据库查询到的类型都是整数,
// 可通过整数转换成枚举类型
public static SizeEnum parseSizeEnum(int num){
for(SizeEnum sizeEnum : SizeEnum.values()){
if(sizeEnum.getNum() == num){
return sizeEnum;
}
}
return null;
}
}
对应的使用的方法测试:
for(SizeEnum sizeEnum : SizeEnum.values()){
System.out.println(sizeEnum); // BIG NORMAL SMALL
}
SizeEnum sizeEnum1 = SizeEnum.SMALL;
System.out.println(sizeEnum1.name()); // "SMALL" 类型是String
System.out.println(sizeEnum1.getDetail()); // "小尺寸"
System.out.println(sizeEnum1.getNum()); // 3
System.out.println(sizeEnum1.ordinal()); // 2 只是表示定义时所处的顺序位置
实际开发时用到的情况可能如下:
// 前端选择尺寸类型(或者数据库中查询的数据字段)
int sizeNum = 2;
// 通过代表数字,转换成对应的枚举类型
SizeEnum sizeEnum = SizeEnum.parseSizeEnum(sizeNum);
if(sizeEnum == null){
// 当传入的数字不正确时的处理程序
return null;
}
switch (sizeEnum){
case SMALL: // 对应的逻辑处理;
break;
case NORMAL: //对应的逻辑处理;
break;
case BIG: //对应的逻辑处理;
break;
}
总结
在我的实际开发中,第二种定义的方式比较多,这种方式既有以前字符串常量的见名知意(枚举实例的名称)的好处,同时可以在枚举类中定义具体的映射关系,将实际项目中数字代码与对应的字符串进行联系,当要用数字代码时(如从数据库取出数字代码后需要发送给前端),只需要通过对应的get方法即可获得,当要用到对应的字符串常量时(比如在日志输出时), 也可通过对应的get方法获得,而当要进行比较时,直接比较对应的枚举实例即可