Java 数据类型在实际开发中应用二枚举

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

1.5之后引入枚举java

一:枚举类基本语法

定义:

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

简单枚举类:编程

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

 

枚举像普通的类同样能够添加属性和方法,以下数组

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

若是不加构造器,直接在 “类型后边加(1)”  这种形式会报错,以下:工具

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

由于枚举类的本质是一个Enum类,因此它能够加一些自定义的方法:好比·上边的getId()post

使用:

能够用来foreach,switch传入枚举变量, case 是枚举内定义的每个类型。性能

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

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

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

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

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

String toString()

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

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

 

二:web项目中应用枚举

@Enumerated
private Gender gender;//entity类

咱们看一下Gender的配置

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

    int id;

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

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

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

若是是hibernate,则会不须要咱们去关系到底查询出来的是什么,只须要指导是枚举类型便可

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) {
                
    }
 }

 

三 :原理分析

   参照了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的效率很是高

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