1. 程式人生 > >java列舉enum類中的values()

java列舉enum類中的values()

近兩天在看spring原始碼時在用EA工具逆向生成spring-web的ER圖看到了HttpMethod()這個列舉類,如圖
這裡寫圖片描述
這個類中的靜態塊
static {
for (HttpMethod httpMethod : values()) {
mappings.put(httpMethod.name(), httpMethod);
}
}
用到了values();使用ecplise搜尋了它的本類發現沒有這個方法,然後查看了列舉類列舉型別的公共基本類也沒有該方法。然後查閱網上資料得知,
最直接的方法就是查閱JDK的文件了,Oracle線上文件的地址在這裡:

http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
從閱讀文件得知,Java編譯器會自動在enum型別中插入一些方法,其中就包括values()——所以我們的程式在沒編譯的時候,自然沒法檢視values()方法的原始碼了。
如下是我實驗過的類
package com;

public enum EnumTest {

BLACK(2,"黑色"),pine,
RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);

private String name;
private int index;
EnumTest(String name, int index) {
    this.name = name;
    this.index = index;
}
EnumTest() {
}
EnumTest(int index,String name) {
    this.index=index;
    this.name = name;
}
public static void getPerName(){
    for(EnumTest enumTest:values()){
        System.out.println(enumTest.name());
    }
}
public static String getName(int index) {
    for (EnumTest c : EnumTest.values()) {
        if (c.getIndex() == index) {
            return c.name;
        }
    }
    return null;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getIndex() {
    return index;
}
public void setIndex(int index) {
    this.index = index;
}

}
在cmd中先使用javac編譯EnumTest,然後在使用javap反編譯EnumTest.class
這裡寫圖片描述
從圖中可以看出該類是繼承自java.lang.enum;而且自動增加了values()、valueOf()等方法。還有一個空的static{}靜態塊。