zoukankan      html  css  js  c++  java
  • Java 数据类型在实际开发中应用二枚举

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

    1.5以后引入枚举

    一:枚举类基本语法

    定义:

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

    简单枚举类:

    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()

    使用:

    可以用来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) 
              比较此枚举与指定对象的顺序。

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

    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());
    }
  • 相关阅读:
    魅族Java面经
    笔试常考的Java基础
    笔试常考的Linux命令大全
    Spring概念
    Java三大框架的配置
    Myeclipse的使用
    项目经验
    Android四大组件及activity的四大启动模式
    java基础
    IT在线笔试总结(二)
  • 原文地址:https://www.cnblogs.com/ldh-better/p/7194044.html
Copyright © 2011-2022 走看看