关于Java Enum的介绍及原理参见
Java枚举(Enum)类型的基本介绍与原理探求
Enum类型的基本使用
定义一个枚举类的主要作用就是在逻辑代码中对某个变量的值进行比较。同样以季节的枚举类SeasonEnum为例,看一下以下比较方式:
SeasonEnum season = SeasonEnum.SPRING;
Assert.assertTrue(season.equals(SeasonEnum.SPRING));
也可以使用compareTo方法比较,类似:
Assert.assertTrue(season.compareTo(SeasonEnum.SPRING)==0);
compareTo()是用来比较两个枚举成员定义时的顺序,通过位置比较两个成员是否相同。
但是现在问题来了, 一般应用中的变量的值很多是从数据库获取,而数据库中不会存储Enum类型实例的值,而是存储字符串或整型。字符串、整型如何和定义的枚举类的成员进行比较呢?
字符串变量与枚举成员比较
比如有一个字符串变量seasonStr ,从数据库获取的值是SPRING,方便起见,定义变量如下:
String seasonStr = "SPRING";
通过上面的那篇介绍, 知道了自定义枚举类在编译的时候会继承java.lang.Enum
,在java.lang.Enum
这个类中可以找到一些父类方法用于比较, 主要的方式有两种。
- 将字符串转换为枚举成员与枚举成员比较(valueOf(String))
SeasonEnum season = SeasonEnum.valueOf(seasonStr);
- 将枚举成员转换为字符串与字符串比较(name()或者toString())
String tranSeasonStr = SeasonEnum.SPRING.name();
也可以直接使用toString()方法
String tranSeasonStr = SeasonEnum.SPRING.toString();
整型变量与枚举成员比较
如果变量是整型呢?比如:
int iSeason = 0;
java.lang.Enum
提供了ordinal()方法用于获取成员的索引位置,号码从0开始,示例代码如下:
@Test
public void intVsEnum() {
int iSeason = 0;
int iTranSeason = SeasonEnum.SPRING.ordinal();
Assert.assertTrue(iSeason==iTranSeason);
}
自定义构造函数和方法
如果枚举定义和数据库的栏位值的设定保持一致的话,以上的使用方式已经足够,但在实际开发中,可能会有如下场景:
枚举类的成员全部使用大写,比如SPRING、SUMMER,但是数据库的栏位值使用单词的方式,即首字母大写,比如Spring,Summer。这样的话比较起来稍显麻烦,需要将字符串转大写后比较,也可以在枚举类中通过增加一个参数的构造函数,并提供返回该参数值的Get方法,比如:
public enum Season2Enum {
SPRING("Spring"), SUMMER("Summer"), AUTUMN("Autumn"), WINTER("Winter");
private String value;
Season2Enum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
- 成员使用新的构造函数构造。
- 构造函数的參數可以是多个。
- 属性和函数需要定义在成员的下面,Java要求先定义enum成员实例,所以在enum实例序列最后加上一个分号,后面再添加方法,添加的方法可以是构造函数和普通方法。
使用的示例代码如下:
@Test
public void constructEnum() {
String seasonStr = "Spring";
String tranSeasonStr = Season2Enum.SPRING.getValue();
Assert.assertTrue(seasonStr.equals(tranSeasonStr));
}
枚举类的常用方法
汇总一下枚举类的常用方法包括:
- values() : 以数组返回所有成员
- vauleOf() : 将字符串转换为枚举实例
- name(): 返回成员的名字
- toString():返回成员的名字,可以覆写
- compareTo(): 比较两个枚举成员定义时的顺序
- ordinal() : 获取枚举成员的索引位置
枚举的其他使用场景
除了用作常量进行比较,枚举类还可以直接使用在Switch分支语句,比如:
@Test
public void enumSwitch() {
SeasonEnum season = SeasonEnum.SPRING;
switch (season) {
case SPRING:
System.out.println("花开了");
break;
case SUMMER:
System.out.println("天热了");
break;
case AUTUMN:
System.out.println("结果了");
break;
case WINTER:
System.out.println("下雪了");
break;
default:
}
}
建议规范
- 类名最好加上Enum后缀
- 成员名全大写
- 单词间使用下划线分隔
- 如果应用中有较多的枚举类,也可以将多个枚举类合并到一个文件中定义