枚舉介紹

DK1.5引入了新的類型——枚舉。在 Java 中它雖然算個「小」功能,卻給個人開發帶來了「大」方便。 java

用法一:常量

JDK1.5 以前,咱們定義常量都是: publicstaticfianl.... 。如今好了,有了枚舉,能夠把相關的常量分組到一個枚舉類型裏,並且枚舉提供了比常量更多的方法。 spring

 

Java代碼 
  1. public enum Color {  
  2.   RED, GREEN, BLANK, YELLOW  
  3. }  

 

用法二:switch

JDK1.6以前的switch語句只支持int,char,enum類型,使用枚舉,能讓咱們的代碼可讀性更強。 ide

 

Java代碼 
  1. enum Signal {  
  2.     GREEN, YELLOW, RED  
  3. }  
  4. public class TrafficLight {  
  5.     Signal color = Signal.RED;  
  6.     public void change() {  
  7.         switch (color) {  
  8.         case RED:  
  9.             color = Signal.GREEN;  
  10.             break;  
  11.         case YELLOW:  
  12.             color = Signal.RED;  
  13.             break;  
  14.         case GREEN:  
  15.             color = Signal.YELLOW;  
  16.             break;  
  17.         }  
  18.     }  
  19. }  

 

用法三:向枚舉中添加新方法

若是打算自定義本身的方法,那麼必須在enum實例序列的最後添加一個分號。並且 Java 要求必須先定義 enum 實例。 函數

 

Java代碼 
  1. public enum Color {  
  2.     RED("紅色"1), GREEN("綠色"2), BLANK("白色"3), YELLO("黃色"4);  
  3.     // 成員變量  
  4.     private String name;  
  5.     private int index;  
  6.     // 構造方法  
  7.     private Color(String name, int index) {  
  8.         this.name = name;  
  9.         this.index = index;  
  10.     }  
  11.     // 普通方法  
  12.     public static String getName(int index) {  
  13.         for (Color c : Color.values()) {  
  14.             if (c.getIndex() == index) {  
  15.                 return c.name;  
  16.             }  
  17.         }  
  18.         return null;  
  19.     }  
  20.     // get set 方法  
  21.     public String getName() {  
  22.         return name;  
  23.     }  
  24.     public void setName(String name) {  
  25.         this.name = name;  
  26.     }  
  27.     public int getIndex() {  
  28.         return index;  
  29.     }  
  30.     public void setIndex(int index) {  
  31.         this.index = index;  
  32.     }  
  33. }  

 

用法四:覆蓋枚舉的方法

下面給出一個toString()方法覆蓋的例子。 this

 

Java代碼 
  1. public enum Color {  
  2.     RED("紅色"1), GREEN("綠色"2), BLANK("白色"3), YELLO("黃色"4);  
  3.     // 成員變量  
  4.     private String name;  
  5.     private int index;  
  6.     // 構造方法  
  7.     private Color(String name, int index) {  
  8.         this.name = name;  
  9.         this.index = index;  
  10.     }  
  11.     //覆蓋方法  
  12.     @Override  
  13.     public String toString() {  
  14.         return this.index+"_"+this.name;  
  15.     }  
  16. }  

 

用法五:實現接口

全部的枚舉都繼承自java.lang.Enum類。因爲Java 不支持多繼承,因此枚舉對象不能再繼承其餘類。 spa

 

Java代碼 
  1. public interface Behaviour {  
  2.     void print();  
  3.     String getInfo();  
  4. }  
  5. public enum Color implements Behaviour{  
  6.     RED("紅色"1), GREEN("綠色"2), BLANK("白色"3), YELLO("黃色"4);  
  7.     // 成員變量  
  8.     private String name;  
  9.     private int index;  
  10.     // 構造方法  
  11.     private Color(String name, int index) {  
  12.         this.name = name;  
  13.         this.index = index;  
  14.     }  
  15. //接口方法  
  16.     @Override  
  17.     public String getInfo() {  
  18.         return this.name;  
  19.     }  
  20.     //接口方法  
  21.     @Override  
  22.     public void print() {  
  23.         System.out.println(this.index+":"+this.name);  
  24.     }  
  25. }  

 

用法六:使用接口組織枚舉

 

Java代碼 
  1. public interface Food {  
  2.     enum Coffee implements Food{  
  3.         BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
  4.     }  
  5.     enum Dessert implements Food{  
  6.         FRUIT, CAKE, GELATO  
  7.     }  
  8. }  

 

用法七:關於枚舉集合的使用

java.util.EnumSet和java.util.EnumMap是兩個枚舉集合。EnumSet保證集合中的元素不重複;EnumMap中的 key是enum類型,而value則能夠是任意類型。關於這個兩個集合的使用就不在這裏贅述,能夠參考JDK文檔。 code

關於枚舉的實現細節和原理請參考: 對象

參考資料:《ThinkingInJava》第四版 blog

http://softbeta.iteye.com/blog/1185573 繼承

/**  
* @Title: TestEnum.java 
* @Package cn.zh.enumtest 
*/
package cn.zh.enumtest;

/***********************************
 * @ClassName: TestEnum.java
 * @Description: 枚舉用法test
 * @author: zenghang
 * @createdAt: 2015年11月3日上午9:43:56
 ***********************************/

public class TestEnum {
	/**
	 * *********************************
	 * @ClassName: TestEnum.java
	 * @Description: 普通枚舉
	 * @author: zenghang
	 * @createdAt: 2015年11月3日上午9:54:26
	 **********************************
	 */
	public enum ColorEnum {
		red,green,yellow,blue;
	}
	
	/**
	 * *********************************
	 * @ClassName: TestEnum.java
	 * @Description: 枚舉像普通的類同樣能夠添加屬性和方法,能夠爲它添加靜態和非靜態的屬性或方法
	 * @author: zenghang
	 * @createdAt: 2015年11月3日上午10:04:09
	 **********************************
	 */
	public enum SeasonEnum {
		//注:枚舉寫在最前面,不然編譯出錯
		spring, summer, autumn, winter;
		
		private final static String position = "test";
		
		public static SeasonEnum getSeason() {
			if("test".equals(position)) {
				return spring;
			} else {
				return winter;
			}
		}
	}
	
	/**
	 * *********************************
	 * @ClassName: TestEnum.java
	 * @Description: 帶有構造器的枚舉
	 * @author: zenghang
	 * @createdAt: 2015年11月3日上午10:16:28
	 **********************************
	 */
	public enum Gender {
		//經過括號賦值,並且必須帶有一個參構造器和一個屬性跟方法,不然編譯出錯
        //賦值必須都賦值或都不賦值,不能一部分賦值一部分不賦值;若是不賦值則不能寫構造器,賦值編譯也出錯
		MAN("MAN"), WOMEN("WOMEN");
		
		private final String value;
		//構造器默認也只能是private, 從而保證構造函數只能在內部使用
		Gender(String value) {
			this.value = value;
		}
		
		public String getValue() {
			return value;
		}
		
	}
	
	/**
	 * *********************************
	 * @ClassName: TestEnum.java
	 * @Description: 實現帶有抽象方法的枚舉
	 * @author: zenghang
	 * @createdAt: 2015年11月3日上午10:18:53
	 **********************************
	 */
	public enum OrderState {
		/** 已取消 */
		CANCEL {public String getName(){return "已取消";}},
		/** 待審覈 */
		WAITCONFIRM {public String getName(){return "待審覈";}},
		/** 等待付款 */
		WAITPAYMENT {public String getName(){return "等待付款";}},
		/** 正在配貨 */
		ADMEASUREPRODUCT {public String getName(){return "正在配貨";}},
		/** 等待發貨 */
		WAITDELIVER {public String getName(){return "等待發貨";}},
		/** 已發貨 */
		DELIVERED {public String getName(){return "已發貨";}},
		/** 已收貨 */
		RECEIVED {public String getName(){return "已收貨";}};
		
		public abstract String getName();
	}
	
	public enum EnumTest {
	    MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) {
	        @Override
	        public boolean isRest() {
	            return true;
	        }
	    },
	    SUN(0) {
	        @Override
	        public boolean isRest() {
	            return true;
	        }
	    };
	 
	    private int value;
	 
	    private EnumTest(int value) {
	        this.value = value;
	    }
	 
	    public int getValue() {
	        return value;
	    }
	 
	    public boolean isRest() {
	        return false;
	    }
	}
	
	public static void main(String []args) {
		ColorEnum colorEnum = ColorEnum.blue;
		switch(colorEnum) {
			case red:
				System.out.println(ColorEnum.red);
				break;
			case green:
				System.out.println(ColorEnum.green);
				break;
			case yellow:
				System.out.println(ColorEnum.yellow);
				break;
			case blue:
				System.out.println(ColorEnum.blue);
				break;
		}
		
		//遍歷枚舉
		for(ColorEnum color : ColorEnum.values()) {
			System.out.println(color);
		}
		
		//獲取枚舉的個數
		System.out.println("ColorEnum 的個數:" + ColorEnum.values().length);
		
		//獲取枚舉的索引位置,默認從0開始
        System.out.println(ColorEnum.red.ordinal());//0
        System.out.println(ColorEnum.green.ordinal());//1
        System.out.println(ColorEnum.yellow.ordinal());//2
        System.out.println(ColorEnum.blue.ordinal());//3
        
        //枚舉默認實現了java.lang.Comparable接口
        System.out.println(ColorEnum.red.compareTo(ColorEnum.green));//-1
        
        //-------------------------
        System.out.println("===============");
        System.err.println("季節爲" + SeasonEnum.getSeason());
        
        //--------------
        System.out.println("===========");
        for(Gender gender : Gender.values()){
            System.out.println(gender.value);
        }
        
        //--------------
        System.out.println("===========");
        for(OrderState order : OrderState.values()){
            System.out.println(order.getName());
        }
        
        //----------------
        System.out.println("EnumTest.FRI 的 value = " + EnumTest.FRI.getValue());
	}
}
相關文章
相關標籤/搜索