zoukankan      html  css  js  c++  java
  • 【Java提高】---枚举的应用

    枚举

       

       一、枚举和静态常量的区别  

           讲到枚举我们首先思考,它和public static final String 修饰的常量有什么不同。

            我举枚举的两个优点:

         1. 保证了类型安全:调用者无法随意传一个 int或者String 等值

         2.代码可读性非常高

    举个例子

            在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如春夏秋冬四个数据元素组成了四季的“数据集”。你写了方法

    get(String season),输入的类型只能是String类型,同时要String只能是(春、夏。秋。冬)。

    这个时候。你写四个字符串常量

    public class Common {
        public static final String SPRING="春";
        public static final String SEASON="夏";
        public static final String SUMMER="秋";
        public static final String AUTUMN="冬";
    }

         在get方法里放入get(Common.SEASON),确实是把"春",放进去了,但是这个时候你会发现这里面有一个隐患,你get(String season),毕竟放入的是String类型的,如果新同事或者不知情的同事,

    不知道这个方法里只能放“春、夏、秋、冬”,它放了个其期它字符串比如get("小小“),这个时候,在编译期它是不会报错的,只有运行之后,才发现错了。   为了防止上面的隐患,枚举出现了

       public enum Season {
            SPRING("春"),
            SUMMER("夏"),
            AUTUMN("秋"),
            WINTER("冬");
       .....
    }

            这个时候,我们修改get方法的传参,改成get(Season   season)   这个时候加入get(Season.SPRING),这就能保证传入的参数只能是这几个。

    二、理解枚举

            首要我们要明确,其实枚举也是个class类,我写个枚举来理解。

    //我们把枚举当做一个普通类
    public enum Season {
        SPRING(1,"春"),
        SUMMER(2,"夏" ),
        AUTUMN(3,"秋" ),
        WINTER(4,"冬");  //这里最后一个一定要分号,否则报错
        
        /*我们可以理解成
         *public static final Season SPRING = new Season(1,春); 
         *public static final Season SUMMER = new Season(2,夏); 
         *public static final Season AUTUMN = new Season(3,秋); 
         *public static final Season WINTER = new Season(4,冬); 
         *既然是对象,那下面就很好理解了
         */
        
        /*
         * 1.上面对象里放了两个参数,那下面就肯定要有这个类型的构造函数
         * 2.这里是private,因为不能在被new对象了
         */
        private Season(int code,String name) {
            this.name = name;
            this.code = code;
        }
        
        //对象的属性
        private String name;
        private int code;
    
        
        //获取对象属性的方法
        public String getName() {
            return this.name;
        }
        public String getCode() {
            return this.name;
        }
    
        //通过code获得对象,我们就可以获得对象的其它属性
        public static Season decode(int code) {
            Season season = null;
            for (Season type : Season.values()) {
                if (type.code==code) {
                    season = type;
                    break;
                }
            }
            return season;
        }
        
        //重新toString方法
        public String toString() {
            return this.name;
        }
    }

          上面这个例子,就很好解释了枚举,它和普通类没什么区别,只是用另一种写法创建了几个有属性的对象,这也必须写这样有属性的构造函数,仅此而已。

    这里顺便列举下枚举的一些特点:

        1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。

        2.  枚举不能在继承其它类了,因为它默认继承了java.lang.Enum

        3.  常量值地址唯一,可以用==直接对比,性能会有提高.

        4.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。

        5.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定。

    三、枚举的常见用法

    第一种:switch运用

    先建一个枚举:

    public enum Common {
    
        INSERT,
        MODIFY,
        DELETE
    }
    //因为这里是无参的对象,所以可以用系统默认的构造函数。也不用写属性和方法。

    在写实现代码

    public class CommonUtils {
    
        public static void getType(Common common){
            Common c=common;
            switch(c)
            {
            case INSERT:
                System.out.println("进行插入操作");
                break;
            case MODIFY:
                System.out.println("进行修改操作");
                break;
            case DELETE:
                System.out.println("进行删除操作");
                break;
            }    
            
        }
        public static void main(String[] args) {
            getType(Common.DELETE);  //后台输出:进行删除操作
        }
    }

    第二种用法,通过key值获得value值获取其它值

      枚举类

    public enum Season {
        SPRING(1,"春","春天放风筝"),
        SUMMER(2,"夏","夏天去游泳"),
        AUTUMN(3,"秋","秋天去秋游"),
        WINTER(4,"冬","冬天吃火锅");  
        
        private Season(int code,String name,String bz) {
            this.code = code;
            this.name = name;
            this.bz=bz;
        }
    
        private int code;
        private String name;
        private String bz;
    
    
        public static Season decode(int code) {
            Season season = null;
            for (Season type : Season.values()) {
                if (type.code==code) {
                    season = type;
                    break;
                }
            }
            return season;
        }
    
    
        public int getCode() {
            return code;
        }
    
        public String getName() {
            return name;
        }
    
        public String getBz() {
            return bz;
        }
    
    }

    测试类

    好了,就写这么多,以后有需要会更深入了解。

    想的太多,做的太少,中间的落差就是烦恼,要么去做,要么别想 少尉【18】

  • 相关阅读:
    SpringBoot项目启动Gzip压缩
    Docker学习(一)
    MySQL中text类型说明
    java MultipartFile多文件上传/通过文件夹解析所有文件
    java后端处理跨域
    SpringCloud Feign调用服务接口时,GET请求变成POST请求报错
    java8 LocalDateTime/LocalDate 获取各种日期类型
    IDEA 不能输入中文
    基于docker 搭建minio 文件服务器
    MySql数据库导入sql错误 Unknown collation: 'utf8mb4_0900_ai_ci'
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/8337514.html
Copyright © 2011-2022 走看看