java枚举类型enum的使用



同事提到我们为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我们都是采用这种方式定义的,很少采用enum 定义,所以也都没有注意过,面对突入起来的问题,还真有点不太清楚为什么有这样的定义。既然不明白就抽时间研究下吧。

enum的简单创建,

  1. enum Weekday {   
  2.     SUNDAY, MONDAY, TUESDAY, WEDNSDAY, THURSDAY, FRIDAY, SATURDAY   
  3. };

如果要进行枚举的赋值,则要重新 私有的构造函数,构造函数的参数类型就是枚举值得类型,具体如下:

public enum HandlerCase {
    	// 利用构造函数传参
    	SDCARD_NO_FOUND(-2), 
    	NOT_WORK(-1), 
    	GET_DATA(0);
    	
    	// 定义私有变量
        private int nCode ;
        // 构造函数,枚举类型只能为私有
        private HandlerCase( int _nCode) {
            this . nCode = _nCode;
        }
        @Override
        public String toString() {
            return String.valueOf ( this . nCode );
        }
    }


一:如何正确理解enum类型?

enum Color { red, white, blue};
Color x;

我们应说x是Color类型的,而不应将x理解成enumeration类型,更不应将其理解成int类型。

理解此类型的最好的方法是将这个类型的值看成是red, white和blue,而不是简单将看成int值。

二:enum与int、String之间的转换

1、简单的枚举的转换

enum<->int
enum -> int: int i = enumType.value.ordinal();
int -> enum: enumType b= enumType.values()[i];

enum<->String

enum -> String: enumType.name()

String -> enum: enumType.valueOf(name); 

2、有初始变量值的转换

enum<->int



public enum HandlerCase {
    	// 利用构造函数传参
    	SDCARD_NO_FOUND(-2), 
    	NOT_WORK(-1), 
    	GET_DATA(0);
    	
    	// 定义私有变量
        private int nCode ;
        // 构造函数,枚举类型只能为私有
        private HandlerCase( int _nCode) {
            this . nCode = _nCode;
        }
        @Override
        public String toString() {
            return String.valueOf ( this . nCode );
        }
        
        public int toInt() {
            return this . nCode ;
        }
        
        // Implementing a from int method on an enum type
        private static final Map<Integer, HandlerCase> intToEnum = new HashMap<Integer, HandlerCase>();
        static {
            // Initialize map from constant name to enum constant
            for(HandlerCase blah : values()) {
            	intToEnum.put(blah.toInt(), blah);
            }
        }
        
        // Returns HandlerCase for int
        public static HandlerCase fromString(int symbol) {
            return intToEnum.get(symbol);
        }
    }
转换方法:
HandlerCase i = HandlerCase.fromString(-1);
int j = i.toInt();

enum<->String


也类似和int转换相同,只是Map的存储类型不一样,要重写toString()方法。


三:enum的应用,包括定义,遍历,switch,enumset,enummap等

Java代码 

[c-sharp]   view plain copy print ?
  1. import java.util.EnumMap;  
  2. import java.util.EnumSet;  
  3. public class EnumTest {  
  4.     // 定义一个enum枚举类型,包括两个实例ON,OFF  
  5.     public enum State {  
  6.         ON, OFF  
  7.     };  
  8.     // 测试函数  
  9.     public static void main(String[] args) {  
  10.         // 直接变量enum  
  11.         for (State s : State.values())  
  12.             System.out.println(s.name());  
  13.         // switch与enum的结合使用  
  14.         State switchState = State.OFF;  
  15.         switch (switchState) {  
  16.         case OFF:  
  17.             System.out.println("OFF");  
  18.             break;  
  19.         case ON:  
  20.             System.out.println("ON");  
  21.             break;  
  22.         }  
  23.         // EnumSet的使用  
  24.         EnumSet<State> stateSet = EnumSet.allOf(State.class);  
  25.         for (State s : stateSet) {  
  26.             System.out.println(s);  
  27.         }  
  28.         // EnumMap的使用  
  29.         EnumMap<State,String> stateMap = new EnumMap<State,String>(State.class);  
  30.         stateMap.put(State.ON, "is On");  
  31.         stateMap.put(State.OFF, "is off");  
  32.         for (State s : State.values()) {  
  33.             System.out.println(s.name() + ":" + stateMap.get(s));  
  34.         }  
  35.     }  
  36. }  

 

 

[c-sharp]   view plain copy print ?
  1. package com.aicent.test;  
  2. public enum TestEnumMathod {  
  3.     // 为每个enum实例添加不同的实现方法  
  4.     SAMPLE1 {  
  5.         String getInfo() {  
  6.             return "SAMPLE1";  
  7.         }  
  8.     },  
  9.     SAMPLE2 {  
  10.         String getInfo() {  
  11.             return "SAMPLE2";  
  12.         }  
  13.     };  
  14.     abstract String getInfo();  
  15.     // 测试  
  16.     public static void main(String args[]) {  
  17.         for (TestEnumMathod method : values()) {  
  18.             System.out.println(method.getInfo());  
  19.         }  
  20.     }  
  21. }  

枚举类型既然是类,那么也就可以有构造函数。只不过不得有公开(Public)的构造函数,这是为了避免直接对枚举类型实例化。如下代码:

Java代码    收藏代码
  1. public class DetailActioin2  
  2. {  
  3.      TURN_LEFT("向左转"),TURN_RIGHT("向右转"),SHOOT("射击");  
  4.        
  5.      private String description;  
  6.        
  7.      //不公开的构造函数  
  8.    private DetailAction2(String description)  
  9.        {  
  10.              this.description = description;  
  11.        }  
  12.   
  13.      public String getDescription()  
  14.        {  
  15.              return description;  
  16.        }  
  17. }  
  18.    

   非公开的构造函数最常见的一个例子就是singleton模式的应用,当某个类只能有一个实例时,可由类维护唯一的实例,这时可以将构造函数设定为私有,取用此类的开发人员就不能自行新增多个实例了。Singleton模式的简易版本代码如下:


Java代码    收藏代码
  1. public class Singleton  
  2. {  
  3.      //构造函数私有,只限内部调用  
  4.    private SingleTon(){};  
  5.     
  6.      private static Singleton instance = null;  
  7.      
  8.      public static synchronized SingleTon getInstance()  
  9.          {  
  10.                 if(instance == null)  
  11.                    instance = new Singleton();  
  12.                 return instance;  
  13.          }  
  14. }  










你可能感兴趣的:(java枚举类型enum的使用)