1. 程式人生 > >Java中enum的學習總結

Java中enum的學習總結

順序 nac ans mil 封裝 com size 一周 mod

一、通常的定義常量的方法

public class Sex{
   public final static int MALE = 1;
   public final static int FEMALE=2;
}

使用的時候,你能夠在程序中直接引用這些常量。可是。這樣的方式還是存在著一些問題。

  1. 類型不安全

因為顏色常量的相應值是整數形。所以程序運行過程中非常有可能給顏色變量傳入一個隨意的整數值。導致出現錯誤。

  1. 沒有命名空間

因為顏色常量僅僅是類的屬性,當你使用的時候不得不通過類來訪問。

  1. 一致性差

由於整形枚舉屬於編譯期常量,所以編譯過程完畢後,全部client和server端引用的地方。會直接將整數值寫入。這樣,當你改動舊的枚舉整數值後或者添加新的枚舉值後,全部引用地方代碼都須要又一次編譯,否則執行時刻就會出現錯誤。

  1. 打印不方便

二.經常使用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;  
	    } 
	    
	}
這樣,運行system.out.prntln(Sex.MALE)時。就會打印出 “男”


假設希望執行過程中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;  
	    } 
	    
	}
這樣。就能夠用setSexDescribtion來動態改變描寫敘述了

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的學習總結