枚举介绍

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());
	}
}
相关文章
相关标签/搜索