標籤:
Java枚舉類 (2009-01-13 11:37:01)
轉載▼
| 標籤: java enum 枚舉 it |
分類: 編程 |
1.建立一個最簡單的枚舉類型
建立枚舉類型要使用enum關鍵字,隱含了所建立的類型都是java.lang.Enum類的子類,它是抽象類別。其中,枚舉類型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚舉類型的名稱。枚舉類型的每一個值都將映射到 protected Enum(String name, int ordinal) 建構函式中,在這裡,每個值的名稱都被轉換成一個字串,並且序數設定表示了此設定被建立的順序。
public enum Size{
SMALL,
MEDIUM,
LARGE;
}
實際上調用了三次建構函式:
new Enum<Size>("SMALL",0);
new Enum<Size>("MEDIUM",1);
new Enum<Size>("LARGE",2);
值的名字和順序值可以分別通過name()/toString()、ordinal()獲得。
自建的枚舉類除了繼承Enum類的方法外還會自動獲得兩個方法values()和valueOf(String name)。不需要自己定義就可以直接使用。這其中的原理我不太清楚,麻煩明白的人給我講講。
values()可以用來遍曆枚舉類中的值,valueOf(String name)可以用來通過名字獲得具體的枚舉值。
獲得枚舉類值的方法:有三種方式,具體見代碼。
public class MostSimpleEnum {
public enum Size{
SMALL,
MEDIUM,
LARGE;
}
public static void main(String[] args){
//兩種獲得枚舉類型的方法
Size s1 = Size.SMALL;
Size s2 = Enum.valueOf(Size.class, "SMALL");
Size s3 = Size.valueOf("MEDIUM");//1
//直接使用‘=’來比較兩個枚舉類型是否相等
if(Size.LARGE == Enum.valueOf(Size.class, "LARGE")){
System.out.println("Size.LARGE == Enum.valueOf(Size.class, \"LARGE\")");
}
//結果同上,枚舉重載了equals方法,但比較方法同上
System.out.println("Size.MEDIUM.equals(Enum.valueOf(Size.class, \"MEDIUM\")):"+
Size.MEDIUM.equals(Enum.valueOf(Size.class, "MEDIUM")));
//遍曆枚舉類型中所有的成員
for(Size s:Size.values()){//2
//1.定義的序號 2.定義的名稱 3.在Enum中被重載,同name()
System.out.println(s.ordinal()+" "+s.name()+" "+s.toString());
}
//分析在抽象類別Enum中沒有定義的兩個方法values()和valuesOf()的來曆
analyzeEnum(s1);
//定義的枚舉類預設繼承的抽象類別java.lang.Enum
//有兩個特殊的方法,我們並沒有定義,結果卻顯示來自我們自定定義的類
//前面都已經使用過的,1.valueOf(String name),2.values()
//枚舉類自動包括這兩個事先被定義好的方法
System.out.println("獲得"+s3);
}
public static void analyzeEnum(Enum e){
System.out.println("class:"+e.getClass().getName());
System.out.println("declear class:"+e.getClass().getDeclaringClass());
System.out.println("super class:"+e.getClass().getSuperclass().getName());
Class<?>[] interfaces = e.getClass().getInterfaces();
for(Class c:interfaces){
System.out.println("implement interdace:"+c.getName());
}
Method[] methods = e.getClass().getMethods();
for(Method m:methods){
System.out.println("mehtods:"+m.getName()+" from:"+m.getDeclaringClass());
}
}
}
2.建立一個複雜點的枚舉類Week,在這個枚舉類中我們為它添加自己定義的成員、構造器、方法。注意雖然在Enum中有構造器,但是我們無法在自訂的枚舉類中調用它,直接繼承java.lang.Enum也是不允許的。我們自己定義的構造器只能被定義成private或者package-protected,同樣在我們也無法調用這個自訂的構造器。
public enum Week {
//定義枚舉類的值
Monday("MON","星期一"),
Tuesday("TUE","星期二"),
Wednesday("WED","星期三"),
Thursday("THU","星期四"),
Friday("FRI","星期五"),
Saturday("SAT","星期六"){
@Override
public boolean isRest(){
return true;
}
},
Sunday("SUN","星期日"){
@Override
public boolean isRest(){
return true;
}
};
private String abbreviation = "";//縮寫
private String chineseName = "";//中文名字
//定義自己的構造器
private Week(String abbreviation,String chineseName){
this.abbreviation = abbreviation;
this.chineseName = chineseName;
}
public String abbreviation(){
return abbreviation;
}
public String getChineseName(){
return chineseName;
}
//周六和周日應該返回true,此方法在周六和周日的值中被重載
public boolean isRest(){
return false;
}
//重載,對它進行稍稍的改動
@Override
public String toString(){
return this.getClass().getName()+"."+this.name();
}
}
//測試Week
public class WeekTest {
public static void main(String[] args){
for(Week week:Week.values()){
System.out.println("-----------------------------------------");
System.out.println("ordinal():"+week.ordinal());
System.out.println("name():"+week.name());
System.out.println("getChineseName():"+week.getChineseName());
System.out.println("abbreviation():"+week.abbreviation());
System.out.println("isRest():"+week.isRest());
System.out.println("toString():"+week.toString());//如果此方法沒有被重載,與name()功能相同.
System.out.println("getDeclaringClass():"+week.getDeclaringClass());
}
}
}
順便說一下,繼承或實現介面的方法和一般Java類是相同的。
Java枚舉類 - 比較兩個枚舉對象Java枚舉類 - 枚舉的集合
參考: 馴服 Tiger: 深入研究枚舉類型 http://www-128.ibm.com/developerworks/cn/java/j-tiger04195/Java 1.5新特性Enum的用法 http://conkeyn.javaeye.com/blog/232757
Java枚舉類