zoukankan      html  css  js  c++  java
  • java的枚举类型Enum解释

    原文:http://www.cnblogs.com/mxmbk/articles/5091999.html

    下文中还添加了个人的一些补充和理解。

    在Java SE5之前,我们要使用枚举类型时,通常会使用static final 定义一组int常量来标识,代码如下

    public static final int MAN = 0;
    public static final int WOMAN = 1;

    相信很多小伙伴,在实际开发中也是那么干的,既然这样已经能实现枚举的功能,为什么还要引入枚举呢?我们接着往下看当我们需要是同这组“int枚举”是代码如下

    public void showSex(int sex){
         switch(sex){
            case MAN:
               System.out.println("this is a boy");   
            break;    
            case WOMAN:
               System.out.println("this is a Girl");   
            break; 
          } 
    }

    看起来这些貌似也没什么问题,但是我们知道,一个项目基本都是基于团队开发,或许只有你自己知道int类型的1代表 gril,0代表Boy。其他同事看到这个函数根本不知道其中的含义,这样的代码很明显阅读性很差,从而会造成沟通成本很高。我们接着往下看,现在你为你 的func写了很nice的注释,傻子都能看得懂(0 boy,1 gril)。但是项目组不可避免的总会出现那么一两个傻子,非要给你传个3进来,而且这样的错误编译器不会报任何错误,运行时会造成什么bug,这个只有 乔老爷知道了。所以这样的代码是极不安全的。使用枚举就能很好的避免上面的问题,接下来我们就来理一理枚举的用法。 
    枚举用于存储数量有限的一组固定的数据集。使用场景:上面说到的性别的表示,一年四级春夏秋冬的表示,一周七天的表示,颜色的表示等等。 
    枚举的简单用法

     // 普通枚举
     public enum ColorEnum {
            white, red, green, blue;
     }
    
        /**
         * 
         * 枚举中有一个自带的静态方法values(),返回enum实例的数据并且该数组中的元素顺序和声明时的顺序一样 
         * 枚举也可以像普通的类一样可以添加属性和方法,可以为它添加静态和非静态的属性或方法
         */
        public enum SeasonEnum {
            //注:枚举写在最前面,否则编译出错
            spring, summer, autumn, winter;
    
            private final static String position = "test";
    
            public static SeasonEnum getSeason() {
                if ("test".equals(position))
                    return spring;
                else
                    return winter;
            }
        }
         /**
         * 带构造器的枚举
         * 必须带有一个参构造器和一个属性跟方法,否则编译出错
         * 
         */
        public enum Mode {
            PULLDOWN("下拉"), PULLUP("上拉");
            private final String value;
    
            /**
             * 构造器默认也只能是private, 从而保证构造函数只能在内部使用
             * 
             */
            private Mode(String value) {
                this.value = value;
            }
    
            public String getValue() {
                return value;
            }
        }

    枚举中还有一个ordinal()方法返回一个int值,这是每个enum实例在声明时的次序,从0开始。枚 举类还实现了Compareable接口,所以他具有compareTo()方法。同时还实现了Serializable接口,还自动为你提供了 equals()和hashCode()方法。除了不能继承一个枚举类之外,我们基本上可以把枚举类当成一个常规的Java类,可以往其中添加新的方法, 包括抽象方法甚至main方法。 
    现在我们用枚举来实现上面的那个性别函数

    public enum EnumSex {
            MAN, WOMAN
    
        }
    
        public static void showSex(EnumSex EnumSex) {
            switch (EnumSex) {
            case MAN:
                System.out.println("this is a boy");
                break;
            case WOMAN:
                System.out.println("this is a girl");
                break;
            }
        }
    
        public static void main(String[] args) {
            showSex(EnumSex.MAN);
            // showSex(EnumSex.Renyao) 编译报错
    
        }

    这样既有很好的阅读性又避免的安全性问题

    Enum类型的语法结构和Class类型还是很不一样的。其中枚举值:

    // 普通枚举
     public enum ColorEnum {
            white, red, green, blue;
     }

    枚举值white,red,green本质可以看作一个ColorEnum类型的对象,普通枚举就是用默认构造方法生成的对象,是没有参数加入的。而下面这种:

     public enum Mode {
            PULLDOWN("下拉"), PULLUP("上拉");
            private final String value;
    
            /**
             * 构造器默认也只能是private, 从而保证构造函数只能在内部使用
             * 
             */
            private Mode(String value) {
                this.value = value;
            }
    
            public String getValue() {
                return value;
            }
        }

    这个就是用了自定义的构造方法,入参就是字符串类型。而且在获取对象的时候,可以通过Mode.PULLDOWN.getValue()来获取"下拉"这个值。



  • 相关阅读:
    软件架构实现
    UVa644
    如何理解Hibernate中的HibernateSessionFactory类
    在pcDuino上使用蓝牙耳机玩转音乐
    Java Web----Java Web的数据库操作(三)
    Pylons Controller里面Session.commit()总是出现rollback
    ORACLE的SQL JOIN方式小结
    关于数据库学习进阶的一点体悟
    IO is frozen on database xxx, No user action is required
    ORACLE等待事件:enq: TX
  • 原文地址:https://www.cnblogs.com/Starshot/p/6895184.html
Copyright © 2011-2022 走看看