Java中enum的學習總結
一、通常的定義常量的方法
public class Sex{ public final static int MALE = 1; public final static int FEMALE=2; }
使用的時候,你能夠在程序中直接引用這些常量。可是。這樣的方式還是存在著一些問題。
- 類型不安全
因為顏色常量的相應值是整數形。所以程序運行過程中非常有可能給顏色變量傳入一個隨意的整數值。導致出現錯誤。
- 沒有命名空間
因為顏色常量僅僅是類的屬性,當你使用的時候不得不通過類來訪問。
- 一致性差
由於整形枚舉屬於編譯期常量,所以編譯過程完畢後,全部client和server端引用的地方。會直接將整數值寫入。這樣,當你改動舊的枚舉整數值後或者添加新的枚舉值後,全部引用地方代碼都須要又一次編譯,否則執行時刻就會出現錯誤。
- 打印不方便
二.經常使用emum定義常量
public enum Sex { MALE , FEMALE; }
可是為了打印方便,你也能夠給enum對象添加一個描寫敘述 註意構造器僅僅能私有private,絕對不同意有public構造器
public enum Sex { MALE("男") , FEMALE("女"); // 枚舉對象的屬性 private String sexDescribtion; // 枚舉對象構造函數 private Sex(String sx){ this.sexDescribtion = sx; } //覆蓋方法 @Override public String toString() { return this.sexDescribtion; } }
假設希望執行過程中Sex這個enum還能夠改變描寫敘述,比方:將MALE的描寫敘述改為“男性”。則能夠這樣子
public enum Sex { MALE("男") , FEMALE("女"); // 枚舉對象的屬性 private String sexDescribtion; // 枚舉對象構造函數 private Sex(String sx){ this.sexDescribtion = sx; } // 獲取枚舉對象的屬性 public String getSexDescribtion(){ return sexDescribtion; } // 改動枚舉對象的屬性 public void setSexDescribtion(String sx){ this.sexDescribtion = sx; } //覆蓋方法 @Override public String toString() { return this.sexDescribtion; } }
Demo:
package com.yjq.reflect; public class User { public enum Sex { MALE("男") , FEMALE("女"); // 枚舉對象的屬性 private String sexDescribtion; // 枚舉對象構造函數 private Sex(String sx){ this.sexDescribtion = sx; } // 獲取枚舉對象的屬性 public String getSexDescribtion(){ return sexDescribtion; } // 改動枚舉對象的屬性 public void setSexDescribtion(String sx){ this.sexDescribtion = sx; } //覆蓋方法 @Override public String toString() { return this.sexDescribtion; } } private int id; private String name; private Sex sex; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Sex getSex() { return sex; } public void setSex(Sex sex) { this.sex = sex; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", sex=" + sex + "]"; } public static void main(String[] args){ User user = new User(); user.setId(1); user.setName("Jim"); user.setSex(Sex.MALE); System.out.println( "user_info:"+user.toString()); } }打印結果
user_info:User [id=1, name=Jim, sex=男]
三. java中的enum解析 摘自:http://www.cnblogs.com/frankliiu-java/archive/2010/12/07/1898721.html
1.enum Color{ 2. RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0); 3. //構造枚舉值。比方RED(255,0,0) 4. private Color(int rv,int gv,int bv){ 5. this.redValue=rv; 6. this.greenValue=gv; 7. this.blueValue=bv; 8. } 9. 10. public String toString(){ //覆蓋了父類Enum的toString() 11. return super.toString()+"("+redValue+","+greenValue+","+blueValue+")"; 12. } 13. 14. private int redValue; //自己定義數據域,private為了封裝。 15. private int greenValue; 16. private int blueValue; 17. }
1. enum非常像特殊的class,實際上enum聲明定義的類型就是一個類。 而這些類都是類庫中Enum類的子類(java.lang.Enum<E>)
Sex枚舉類就是class,並且是一個不能夠被繼承的final類。
其枚舉值(MALE,FEMALE)都是Color類型的類靜態常量, 我們能夠通過以下的方式來得到Color枚舉類的一個實例:
Color c=Color.MALE;
註意:這些枚舉值都是public static final的,也就是我們常常所定義的常量方式,因此枚舉類中的枚舉值最好所有大寫。
2. 即然枚舉類是class。當然在枚舉類型中有構造器,方法和數據域。可是。枚舉類的構造器有非常大的不同:
(1) 構造器僅僅是在構造枚舉值的時候被調用
(2) 構造器僅僅能私有private。絕對不同意有public構造器
3.全部枚舉類都繼承了Enum的方法,以下我們具體介紹這些方法。
(1) ordinal()方法: 返回枚舉值在枚舉類種的順序。
這個順序依據枚舉值聲明的順序而定。
Color.RED.ordinal(); //返回結果:0
Color.BLUE.ordinal(); //返回結果:1
(2) compareTo()方法: Enum實現了java.lang.Comparable接口,因此能夠比較象與指定對象的順序。
Enum中的compareTo返回的是兩個枚舉值的順序之差。當然,前提是兩個枚舉值必須屬於同一個枚舉類,否則會拋出ClassCastException()異常。(詳細可見源碼)
Color.RED.compareTo(Color.BLUE); //返回結果 -1
(3) values()方法: 靜態方法,返回一個包括所有枚舉值的數組。
Color[] colors=Color.values();
for(Color c:colors){
System.out.print(c+",");
}//返回結果:RED,BLUE,BLACK YELLOW,GREEN,
(4) toString()方法: 返回枚舉常量的名稱。
Color c=Color.RED;
System.out.println(c);//返回結果: RED
(5) valueOf()方法: 這種方法和toString方法是相相應的,返回帶指定名稱的指定枚舉類型的枚舉常量。
Color.valueOf("BLUE"); //返回結果: Color.BLUE
(6) equals()方法: 比較兩個枚舉類對象的引用
4、枚舉類能夠在switch語句中使用。
1.Color color=Color.RED; 2.switch(color){ 3. case RED: System.out.println("it‘s red");break; 4. case BLUE: System.out.println("it‘s blue");break; 5. case BLACK: System.out.println("it‘s blue");break; 6.}
5. 兩個工具類 EnumSet 和 EnumMap
摘自:http://www.ibm.com/developerworks/cn/java/j-lo-enum/
JDK5.0 中在添加 Enum 類的同一時候,也添加了兩個工具類 EnumSet 和 EnumMap,這兩個類都放在 java.util 包中。EnumSet 是一個針對枚舉類型的高性能的 Set 接口實現。EnumSet 中裝入的全部枚舉對象都必須是同一種類型。在其內部,是通過 bit-vector 來實現。也就是通過一個 long 型數。EnumSet 支持在枚舉類型的全部值的某個範圍中進行叠代。回到上面日期枚舉的樣例上:
enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun }
你可以在每周七天日期中進行叠代。EnumSet 類提供一個靜態方法 range 讓叠代非常easy完畢:
for(WeekDayEnum day : EnumSet.range(WeekDayEnum.Mon, WeekDayEnum.Fri)) {
System.out.println(day);
}
打印結果例如以下:
Mon
Tue
Wed
Thu
Fri
EnumSet 還提供了非常多個類型安全的獲取子集的 of 方法,使你非常easy取得子集:
EnumSet<WeekDayEnum> subset = EnumSet.of(WeekDayEnum.Mon, WeekDayEnum.Wed);
for (WeekDayEnum day : subset) {
System.out.println(day);
}
打印結果例如以下:
Mon
Wed
與 EnumSet 類似。EnumMap 也是一個高性能的 Map 接口實現。用來管理使用枚舉類型作為 keys 的映射表。內部是通過數組方式來實現。
EnumMap 將豐富的和安全的 Map 接口與數組高速訪問結合到一起。假設你希望要將一個枚舉類型映射到一個值,你應該使用 EnumMap。看以下的樣例:
清單 5. EnumMap 演示樣例
// 定義一個 EnumMap 對象,映射表主鍵是日期枚舉類型,值是顏色枚舉類型
private static Map<WeekDayEnum, RainbowColor> schema =
new EnumMap<WeekDayEnum, RainbowColor>(WeekDayEnum.class);
static{
// 將一周的每一天與彩虹的某一種色彩映射起來
for (int i = 0; i < WeekDayEnum.values().length; i++) {
schema.put(WeekDayEnum.values()[i], RainbowColor.values()[i]);
}
}
System.out.println("What is the lucky color today?");
System.out.println("It‘s " + schema.get(WeekDayEnum.Sat));
當你詢問周六的幸運色彩時候,會得到藍色:
清單 6. 執行結果
What is the lucky color today?
It‘s BLUE
四.enum的作用
Enum 類型提出給 JAVA 編程帶了了極大的便利。讓程序的控制更加的easy,也不easy出現錯誤
Java中enum的學習總結