关于Java Enum的介绍及原理参见
Java枚举(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
这个类中可以找到一些父类方法用于比较, 主要的方式有两种。
SeasonEnum season = SeasonEnum.valueOf(seasonStr);
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;
}
}
@Test
public void constructEnum() {
String seasonStr = "Spring";
String tranSeasonStr = Season2Enum.SPRING.getValue();
Assert.assertTrue(seasonStr.equals(tranSeasonStr));
}
汇总一下枚举类的常用方法包括:
除了用作常量进行比较,枚举类还可以直接使用在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:
}
}