- enum Season {
- SPRING, SUMMER, AUTUMN, WINTER
- }
在本例中,對於Season.SPRING這個對象,Season.SPRING.name()能夠得到該對象的字符串,即“SPRING”;反之,由Season.valueOf(“SPRING”)則能夠得到該對象,即Season.SPRING。也就是說,使用name()方法和valueOf(String)方法能夠在枚舉類型對象和字符串之間方便得轉換。當然,假設valueOf(String)方法的參數不是該枚舉類型合法的字符串,則會拋出IllegalArgumentException異常。
對於枚舉類型,Java內部實際上還是轉換為java.lang.Enum的子類,能夠通過“javap -c Season”命令反編譯來觀察這一點。Enum類提供了一個ordinal()方法,用來返回枚舉對象的序數,比方本例中SPRING, SUMMER, AUTUMN, WINTER的序數就分別為0, 1, 2, 3。在有些情況下,我們須要使用這個序數,並且還有可能再依據這個序數生成所須要的枚舉對象,但是Enum並沒有提供valueOf(int)這個方案,那是不是就做不到呢?
對於這個問題,實際上能夠利用枚舉類型的values()方法間接的做到。values()方法返回一個枚舉對象數組,比方本例就是Season[],數組元素依照序數排列。在自己定義的枚舉類型中,我們僅僅要定義自己的valueOf(int)方法,並返回該數組下標對象的對象就能夠了。代碼例如以下:
- enum Season {
- SPRING, SUMMER, AUTUMN, WINTER;
- public static Season valueOf(int ordinal) {
- if (ordinal < 0 || ordinal >= values().length) {
- throw new IndexOutOfBoundsException("Invalid ordinal");
- }
- return values()[ordinal];
- }
- }