java枚举类型enum的使用

来源:互联网 发布:淘宝代上架 编辑:程序博客网 时间:2024/05/04 20:36


同事提到我们为什么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 plaincopyprint?
  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 plaincopyprint?
  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. }  









0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 卡地亚戒指花了怎么办 手表摔了不走了怎么办 ck手表表扣很难打开怎么办 小天才泡了水怎么办 小天才手表掉水里了怎么办 小天才电话手表进水了怎么办 小天才手表进水了怎么办 小天才电话手表丢了怎么办 小天才电话手表黑屏怎么办 安全守护注册码忘记了怎么办 儿童安全锁的门打不开怎么办 守护宝老年机打不开了怎么办 小米电话手表坏了怎么办 小米手表带坏了怎么办 小米电话手表屏幕坏了怎么办 雷诺梅甘娜06款系统错乱怎么办 轿车碰了一个坑怎么办 车子卖了没过户怎么办 9岁儿童肠胃痉挛怎么办 鹿角胶水放多了怎么办 打胰岛素血糖还是高怎么办 血糖高打胰岛素降不下去怎么办 儿童低烧37度1怎么办 小孩发烧一会冷一会热怎么办 月子里得的风湿怎么办 腰窝中间凸起肉怎么办 线雕后一个月脸发红肿胀怎么办 雷诺氏病手指僵硬疼怎么办 哺乳妈妈吃咸了怎么办 吃流产药哺乳了怎么办 坐月子吃咸了怎么办啊 拔罐放血后头晕怎么办 e道航界面不动怎么办 微信必须打开位置权限怎么办 魅族sim卡未启用怎么办 苹果6sgps信号弱怎么办 苹果5s4g网络慢怎么办 苹果5s上网很慢怎么办 手机一体机死机关不了机怎么办 联想一体机关不了机怎么办 纸巾盒的吸盘老化了怎么办