前言
阿里巴巴Java开发手册中推荐,如果常量类中变量值仅在一个范围内变化,且带有名称之外的延伸属性, 建议定义为枚举类。使用枚举类可以使我们的代码更加规范且美观。
一、什么情况下可以使用枚举类?
变量值仅在一个范围内变化,且带有名称之外的延伸属性时,可以将这些变量存入一个枚举类当中。
使用场景例如:键值确定的字典,是和否,其它业务场景。
其它业务场景,例如:一星期七天枚举类
public enum WeekEnums
{
OTHER,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY;
}
由于枚举类的下标是从0开始算起的,另一个OTHER占位,这样的话,星期一到七就对应下标1~7。
不过,在对性能要求比较高的接口中,键值对字典最好还是使用专门且高效的set和map实现。
二、枚举类封装方法列举
直接读取枚举类的常量,例如WeekEnums.MONDAY返回的对象类型是WeekEnums类,这个类型对于业务上来说基本没有意义,我们主要还是要用到枚举类的封装方法来实现我们的需求。
1.name()和toString()方法
这两个方法都是返回此枚举常量的名称,大多数情况下我们应该使用toString()方法,因为toString方法会返回一个更加用户友好的名称。name()方法主要用于专门的情况,其中正确性取决于获得确切的名称。
2.ordinal()方法
返回此枚举常数的序数(即常量的下标,下标从零开始记)。
3.valueOf()方法和values()方法
public static T valueOf(String)方法返回具有指定名称的指定枚举类型的枚举常量的名称。该方法几乎没有用处,既然参数已经传了名称,返回的结果却和参数一模一样,唯一的用处是用来判断字符串是否是枚举的一个常量名称。
values()方法则是返回枚举常量的数组,通过数组下标索引可以返回指定的枚举常量,该枚举常量可以调用前面两点提到的方法返回需要的结果。
三、使用举例
1、获取星期枚举类下标
System.out.println(WeekEnums.MONDAY.ordinal()); // 0
System.out.println(WeekEnums.TUESDAY.ordinal()); // 1
或者
System.out.println(WeekEnums.values()[0].ordinal()); // 0
System.out.println(WeekEnums.values()[1].ordinal()); // 1
2、获取枚举常量名称
System.out.println(WeekEnums.MONDAY.toString()); // MONDAY
System.out.println(WeekEnums.TUESDAY.toString()); //TUESDAY
或者
System.out.println(WeekEnums.valueOf("MONDAY")); //MONDAY
System.out.println(WeekEnums.valueOf("TUESDAY")); //TUESDAY
3、遍历枚举类,组成键值对
Map<String, Integer> map = new HashMap<>(); //枚举常量字符串与下标键值对
int length = WeekEnums.values().length;
for(int i = 0; i < length; i++){
map.put(WeekEnums.values()[i].toString(), WeekEnums.values()[i].ordinal());
}