一、枚举的介绍,以如下的枚举为例子进行介绍
enum Size {
Small, Medium, Large, ExtraLarge;
}
如上的声明定义了一个类,它有4个实例不可能再构造出新的对象,即:Size size = new Size(); 编译时不会通过的
既然枚举是一个类,那么他有什么特殊的方法呢?
1、toString()
如上如果想要获取Small对应的字符串“Small”,那么可以用toString的方式获得: Size.Small.toString()
2、valueOf()
与toString相对应的是valueOf的使用,如果想要获取Size的Small,那么可以通过valueOf的方式获得:Size.valueOf("Small")
如果输入的是Size中不存在的枚举会如何呢? 会抛出异常:IllegalArgumentException
3、ordinal()
这个函数获取的是枚举常量的位置,从0开始计数;比如要获取Large的ordinal:Size.Large.ordinal()
4、compareTo()
比较两个枚举值的大小(其实是比较两个枚举值的ordinal)
public final int compareTo(E var1) {
if (this.getClass() != var1.getClass() && this.getDeclaringClass() != var1.getDeclaringClass()) {
throw new ClassCastException();
} else {
return this.ordinal - var1.ordinal;
}
}
如上所示,是本身的ordinal跟var1.ordinal的差值,所以相等返回0,比他大返回大于0反之返回小于0
5、values()
获取所有的枚举,则可以用values来获取。比如获取Size的所有枚举:Size.values(); 返回的是一个按照ordinal顺序排列的数组:[Size.Small, Size.Medium, Size.Large, Size.ExtraLarge]
二、关于枚举使用简写
有时候我们在命名的时候写了一串很长的名字,但是我们显示给用户的时候希望只是一个简短的字符串,那么可以通过使用枚举简写的方式
enum FlagSize {
Small("S"), Big("B");
String flag;
private FlagSize(String flag) { this.flag = flag;}
public String getFlag() {return flag;}
}
如上所示,将Small简写为"S", big简写为B
接一中的第一点,枚举的构造都是private,所以这里重写FlagSize的构造函数只能是private,因为Small和Big是FlagSize的实例,所以“S”和“B”是构造的时候传给flag的参数
那么我们在获取简写的时候可以通过getFlag()来获取。
三、在实际工作中遇到的问题
遇到这么一个情况:有两个枚举类她们的枚举名字是一样的并且排列的位置也是一样的;
那么一个的枚举值该如何转换成另外一个枚举的枚举值
enum Size {
Small, Medium, Large, ExtraLarge;
}
enum TempSize {
Small, Medium, Large, ExtraLarge;
}
一种是将TempSize转化为String,然后Size对应的枚举值转换为String再在TempSize对应的ArrayList<String>中查找即
TempSize[] tempSizes = TempSize.values();
ArrayList<String> lstTempSizes = new ArrayList<>(tempSizes.length);
for (TempSize tempSize : tempSizes) {
lstTempSizes.add(tempSize.toString());
}
int index = lstTempSizes.indexOf(size.toString());
这里再通过index获取到对应tempSizes中的TempSize
另一种是通过ordinal的方式
TempSize[] tempSizes = TempSize.values();
TempSize tempSize = tempSizes[size.ordinal()]; // 这里需要提前判断ordinal是否在tempSizes的范围内否则会越界
很明显,第二种使用ordinal的方式比较简单