一、枚举的介绍,以如下的枚举为例子进行介绍

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的方式比较简单