在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。在JDK1.5之前,人们用接口来描述这一种数据类型。

1.5以后引入枚举

一:枚举类基本语法

定义:

  创建枚举类型要使用 enum 关键字,如果是想声明简单枚举,属性之间用逗号相隔 ;如果是属性带id,类似(male(1))这种还需要一个带id的构造方法

简单枚举类:

public enum ColorEnum {
        red, green, yellow, blue;
 }

 

枚举像普通的类一样可以添加属性和方法,如下

seo优化培训,网络推广培训,网络营销培训,SEM培训,网络优化,在线营销培训

public enum Gender {
    MALE(0), // 男
    FEMALE(1); // 女
    int id;
    Gender(int id) {        this.id = id;
    }    public int getId() {        return id;
    }
}

seo优化培训,网络推广培训,网络营销培训,SEM培训,网络优化,在线营销培训

如果不加构造器,直接在 “类型后边加(1)”  这种形式会报错,如下:

enum ColorEnum {
    red(1), green(2), yellow(3), blue(4);//编译出错:The constructor ColorEnum(int) is undefined
}

因为枚举类的本质是一个Enum类,所以它可以加一些自定义的方法:比如·上边的getId()

使用:

可以用来foreach,switch传入枚举变量, case 是枚举内定义的每一个类型。

seo优化培训,网络推广培训,网络营销培训,SEM培训,网络优化,在线营销培训

Gender gender = Gender.womenswitch (gender) {     case male:
         System.out.println("male");          break;     case female:
         System.out.println("female");          break;

seo优化培训,网络推广培训,网络营销培训,SEM培训,网络优化,在线营销培训

int compareTo(E o) 
          比较此枚举与指定对象的顺序。

Class<E> getDeclaringClass() 
          返回与此枚举常量的枚举类型相对应的 Class 对象。

String name() 
          返回此枚举常量的名称,在其枚举声明中对其进行声明。

int ordinal() 
          返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

String toString()

           返回枚举常量的名称,它包含在声明中。

static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 
          返回带指定名称的指定枚举类型的枚举常量。

 

二:web项目中应用枚举

@Enumeratedprivate Gender gender;//entity类

我们看一下Gender的配置

seo优化培训,网络推广培训,网络营销培训,SEM培训,网络优化,在线营销培训

ublic enum Gender {
    MALE(0), // 男
    FEMALE(1); // 女

    int id;

    Gender(int id) {        this.id = id;
    }    public int getId() {        return id;
    }
}

seo优化培训,网络推广培训,网络营销培训,SEM培训,网络优化,在线营销培训

,如果调用的原声的dao,查询出来的结果是Map

userVO.setGender(Gender.valueOf((String) map.get("gender")));//如果查询出来的是Map,则通过 Gender.valueOf(方法得到想要的枚举

如果是hibernate,则会不需要我们去关系到底查询出来的是什么,只需要指导是枚举类型即可

seo优化培训,网络推广培训,网络营销培训,SEM培训,网络优化,在线营销培训

List<UserVO> userVOList = new ArrayList<UserVO>();try {
    String queryString = "select *  from User U left join U.institutions INS where INS.institution.id = '"
                    + id + "' order by U.code";
    userList = userDao.query(queryString);//如果是调用hibernate,查询出来不需要调用valueOf()方法    if (userList != null && userList.size() > 0) {
                
    }
 }

seo优化培训,网络推广培训,网络营销培训,SEM培训,网络优化,在线营销培训

 

三 :原理分析

   参照了java enum(枚举)使用详解 + 总结,非常感谢

   enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译实际上是生成了一个类,该类继承了java.lang.Enum<E>。所以, enum本质上 java 编译器帮我们做了语法的解析和编译的一个普通的类。

   唯一的区别,是枚举隐式继承了Enum,所以不可以在继承 ..

 EnumTest test = EnumTest.TUE;
...
System.out.println("getDeclaringClass(): " +     test.getDeclaringClass().getName());//输出结果是getDeclaringClass(): com.dtsz.enumTest.EnumTest

 

四:EnumSet,EnumMap 的应用

   EnumSet和EnumMap是枚举的比较重要的用处。他们是操作枚举对象的工具类。具体的细节推荐去看一下Java 枚举用法详解,在这里,我简单的总结一下:

  EnumSet 是枚举类型的高性能Set实现。它要求放入它的枚举常量必须属于同一枚举类型。
  EnumMap 是专门为枚举类型量身定做的Map实现。虽然使用其它的Map实现(如HashMap)也能完成枚举类型实例到值得映射,但是使用EnumMap会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以EnumMap使用数组来存放与枚举类型对应的值。这使得EnumMap的效率非常高

seo优化培训,网络推广培训,网络营销培训,SEM培训,网络优化,在线营销培训

/ EnumSet的使用
System.out.println("EnumSet展示");
EnumSet<ErrorCodeEn> errSet = EnumSet.allOf(ErrorCodeEn.class);for (ErrorCodeEn e : errSet) {
    System.out.println(e.name() + " : " + e.ordinal());
}// EnumMap的使用System.out.println("EnumMap展示");
EnumMap<StateMachine.Signal, String> errMap = new EnumMap(StateMachine.Signal.class);
errMap.put(StateMachine.Signal.RED, "红灯");
errMap.put(StateMachine.Signal.YELLOW, "黄灯");
errMap.put(StateMachine.Signal.GREEN, "绿灯");for (Iterator<Map.Entry<StateMachine.Signal, String>> iter = errMap.entrySet().iterator(); iter.hasNext();) {
    Map.Entry<StateMachine.Signal, String> entry = iter.next();
    System.out.println(entry.getKey().name() + " : " + entry.getValue());
}

seo优化培训,网络推广培训,网络营销培训,SEM培训,网络优化,在线营销培训

 

作者:leader_Hoo 
出处:http://www.cnblogs.com/ldh-better/ 
本文版权归作者和博客园共有,欢迎转载,唯一要求的就是请注明转载,此外,如果博客有帮助,希望可以帮忙点击推荐和分享,谢谢

http://www.cnblogs.com/ldh-better/p/7194044.html

延伸阅读

向着Java前进-Java培训,做最负责任的教育,学习改变命运,软件学习,再就业,大学生如何就业,帮大学生找到好工作,lphotoshop培训,电脑培训,电脑维修培训,移动软件开发培训,网站设计培训,网站建设培训向着Java前进