zoukankan      html  css  js  c++  java
  • 枚举类与注解 之 枚举类讲解

    枚举类与注解

    参考网站:https://www.bilibili.com/video/BV1X741147h5?p=4

    • 枚举类和注解可以看做是jdk5.0出现的两个新特性。

    枚举类的使用:入门

    类的对象只有有限个,确定的。

    举例子:

    星期:星期一,星期二,,星期日。

    季节:春、夏、秋、冬。

    等等

    • 当需要定义一组常量的时候,强烈建议使用枚举类。

    如果枚举类中只有一个对象,则可以作为单例模式的一种实现方式。

    如何定义枚举类:

    方式一:jdk5.0之前,自定义枚举类

    方式二:jdk5.0时候,可以使用enum关键字定义枚举类。

    方式一:jdk5.0之前,自定义枚举类 代码展示:

    package com.enumstudy;
    
    /**
     * 枚举类的使用和测试
     * 创建枚举类,使用jdk5.0之前的方式进行创建
     */
    public class SessionTest {
        public static void main(String[] args) {
            Season autumn = Season.AUTUMN;
            System.out.println(autumn);
        }
    }
    
    /**
     * 自定义枚举类
     * 现在创建的就是枚举类
     */
    class Season{
        //1.申明Session对象的属性:private final 修饰
        private final String seasonName;
        private final String seasonDesc;
    
        //2.私有化类的构造器,并且给对象属性赋值
        private Season(String seasonName, String seasonDesc) {
            this.seasonName = seasonName;
            this.seasonDesc = seasonDesc;
        }
        //3.提供当前枚举类的多个对象
        public static final Season SPRING = new Season("春天","春天是温暖的");
        public static final Season SUMMER = new Season("夏天","夏天是炎热的");
        public static final Season AUTUMN = new Season("秋天","秋天是凉爽的");
        public static final Season WINTER = new Season("冬天","冬天是寒冷的");
        //4.其他诉求1:获取枚举类对象的属性
        public String getSeasonName() {
            return seasonName;
        }
    
        public String getSeasonDesc() {
            return seasonDesc;
        }
        //4.其他诉求2:添加头toString()
        @Override
        public String toString() {
            return "Season{" +
                    "seasonName='" + seasonName + '\'' +
                    ", seasonDesc='" + seasonDesc + '\'' +
                    '}';
        }
    }
    
    

    方式二:使用enum关键字创建枚举类:

    package com.enumstudy;
    
    /**
     * 使用enum关键字的方式创建枚举类
     * 需要注意的是:定义的enum枚举类,继承于class java.lang.Enum
     */
    public class SeasonTest1 {
        public static void main(String[] args) {
            Season1 autumn1 = Season1.AUTUMN;
            System.out.println(autumn1);//如果我们没有重写Enum类中的toString()。输出结果:AUTUMN 说明enum的父类不是Object,因为如果是Object的话,Object中的toString()方法打印出来的是对象的地址值。
            //重写了toString()的话,输出结果:Season{seasonName='秋天', seasonDesc='秋天是凉爽的'}
            System.out.println("enum类的父类是:"+Season1.class.getSuperclass());//如果我们没有重写Enum类中的toString()。enum类的父类是:class java.lang.Enum
            System.out.println("===============================================");
    //        values()主要是用来罗列枚举类的状态
            Season1[] values = Season1.values();
            for (int i = 0; i < values.length; i++) {
                System.out.println(values[i]);
            }
            //运行结果:
            /**
             * Season{seasonName='春天', seasonDesc='春天是温暖的'}
             * Season{seasonName='夏天', seasonDesc='夏天是炎热的'}
             * Season{seasonName='秋天', seasonDesc='秋天是凉爽的'}
             * Season{seasonName='冬天', seasonDesc='冬天是寒冷的'}
             */
            //类似的我们还可以查看线程的状态
            System.out.println("===============================================");
            Thread.State[] states = Thread.State.values();
            for (int i = 0; i < states.length; i++) {
                System.out.println(states[i]);
            }
            System.out.println("===============================================");
            //valueOf(String objName) :返回枚举类中对象名称是objName的对象
            Season1 summer = Season1.valueOf("SUMMER");
            System.out.println(summer);
            //运行结果:Season{seasonName='夏天', seasonDesc='夏天是炎热的'}
    
        }
    }
    //使用enum关键字的方式定义枚举类
    enum  Season1{
        //说白了就是在jdk5.0方式创建枚举类基础上进行简化,将相同的东西删除掉
        //1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象“;”结束
        SPRING("春天","春天是温暖的"),
        SUMMER("夏天","夏天是炎热的"),
        AUTUMN("秋天","秋天是凉爽的"),
        WINTER("冬天","冬天是寒冷的");
    
        //1.申明Season1对象的属性,使用private final来进行修饰
        private final String seasonName;
        private final String seasonDesc;
    
        //2.私有化类的构造器,并且给对象属性赋值
        private Season1(String seasonName, String seasonDesc) {
            this.seasonName = seasonName;
            this.seasonDesc = seasonDesc;
        }
        //4.其他诉求1:获取枚举类对象的属性
        public String getSeasonName() {
            return seasonName;
        }
    
        public String getSeasonDesc() {
            return seasonDesc;
        }
    
        //5.其他诉求2:添加头toString()
        @Override
        public String toString() {
            return "Season{" +
                    "seasonName='" + seasonName + '\'' +
                    ", seasonDesc='" + seasonDesc + '\'' +
                    '}';
        }
    }
    
    

    class java.lang.Enum类中的toString():

        public String toString() {
            return name;
        }
    

    枚举类enum实现接口情况

    情况一:实现接口,在enum类中实现抽象方法

    package com.enumstudy;
    
    /**
     * 使用enum关键字的方式创建枚举类
     * 需要注意的是:定义的enum枚举类,继承于class java.lang.Enum
     */
    public class SeasonTest1 {
        public static void main(String[] args) {
            Season1 autumn1 = Season1.AUTUMN;
            autumn1.show();//运行结果:这是一个季节
            Season1 autumn1 = Season1.SUMMER;
            autumn1.show();//运行结果:这是一个季节
            //由此我们可以看出,不论枚举类中的哪一个对象来使用,最终的运行结果都是一样的
    
        }
    }
    
    /**
     * 定义一个接口
     */
    interface Info{
        void show();
    }
    //使用enum关键字的方式定义枚举类
    enum  Season1 implements Info{
        //说白了就是在jdk5.0方式创建枚举类基础上进行简化,将相同的东西删除掉
        //1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象“;”结束
        SPRING("春天","春天是温暖的"),
        SUMMER("夏天","夏天是炎热的"),
        AUTUMN("秋天","秋天是凉爽的"),
        WINTER("冬天","冬天是寒冷的");
    
        //1.申明Season1对象的属性,使用private final来进行修饰
        private final String seasonName;
        private final String seasonDesc;
    
        //2.私有化类的构造器,并且给对象属性赋值
        private Season1(String seasonName, String seasonDesc) {
            this.seasonName = seasonName;
            this.seasonDesc = seasonDesc;
        }
        //4.其他诉求1:获取枚举类对象的属性
        public String getSeasonName() {
            return seasonName;
        }
    
        public String getSeasonDesc() {
            return seasonDesc;
        }
    
        //5.其他诉求2:添加头toString()
        @Override
        public String toString() {
            return "Season{" +
                    "seasonName='" + seasonName + '\'' +
                    ", seasonDesc='" + seasonDesc + '\'' +
                    '}';
        }
    
        @Override
        public void show() {
            System.out.println("这是一个的季节");
        }
    }
    
    

    情况二:枚举类实现接口,我们想要枚举类中的每个对象调用接口中的方法的时候,展示结果都不一样。

    package com.enumstudy;
    
    /**
     * 使用enum关键字的方式创建枚举类
     * 需要注意的是:定义的enum枚举类,继承于class java.lang.Enum
     */
    public class SeasonTest1 {
        public static void main(String[] args) {
            Season1 autumn1 = Season1.AUTUMN;
            autumn1.show();
            Season1 summer1 = Season1.SUMMER;
            summer1.show();
           /**
           *运行结果:
              秋天是一个秋高气爽的季节
              夏天是一个热情似火的季节
           *
           */
        }
    }
    
    /**
     * 定义一个接口
     */
    interface Info{
        void show();
    }
    //使用enum关键字的方式定义枚举类
    enum  Season1 implements Info{
        //说白了就是在jdk5.0方式创建枚举类基础上进行简化,将相同的东西删除掉
        //1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象“;”结束
        SPRING("春天","春天是温暖的"){
            @Override
            public void show() {
                System.out.println("春天是一个春暖花开的季节");
            }
        },
        SUMMER("夏天","夏天是炎热的"){
            @Override
            public void show() {
                System.out.println("夏天是一个热情似火的季节");
            }
        },
        AUTUMN("秋天","秋天是凉爽的"){
            @Override
            public void show() {
                System.out.println("秋天是一个秋高气爽的季节");
            }
        },
        WINTER("冬天","冬天是寒冷的"){
            @Override
            public void show() {
                System.out.println("冬天是一个冰天雪地的季节");
            }
        };
    
        //1.申明Season1对象的属性,使用private final来进行修饰
        private final String seasonName;
        private final String seasonDesc;
    
        //2.私有化类的构造器,并且给对象属性赋值
        private Season1(String seasonName, String seasonDesc) {
            this.seasonName = seasonName;
            this.seasonDesc = seasonDesc;
        }
        //4.其他诉求1:获取枚举类对象的属性
        public String getSeasonName() {
            return seasonName;
        }
    
        public String getSeasonDesc() {
            return seasonDesc;
        }
    
        //5.其他诉求2:添加头toString()
        @Override
        public String toString() {
            return "Season{" +
                    "seasonName='" + seasonName + '\'' +
                    ", seasonDesc='" + seasonDesc + '\'' +
                    '}';
        }
    }
    
    

    特别注意:虽然我们说枚举类一般表示的是一组固定的值,但是我们在实际的开发中,枚举类中的值,我们也是可以修改的。

    下面给大家举一个例子:

    package com.enumstudy;
    
    public enum  Season2 {
        SPRING("春天","春天是温暖的"),
        SUMMER("夏天","夏天是炎热的"),
        AUTUMN("秋天","秋天是凉爽的"),
        WINTER("冬天","冬天是寒冷的");
    
        //1.申明Season2对象的属性,使用private 来进行修饰,注意,这里我不是用final来进行修饰了,不使用final来进行修饰,我就可以给这两个属性值添加上set方法了。
        private String seasonName;
        private String seasonDesc;
    
        //2.私有化类的构造器,并且给对象属性赋值
        private Season2(String seasonName, String seasonDesc) {
            this.seasonName = seasonName;
            this.seasonDesc = seasonDesc;
        }
        //4.其他诉求1:获取枚举类对象的属性
        public String getSeasonName() {
            return seasonName;
        }
    
        public String getSeasonDesc() {
            return seasonDesc;
        }
    
        //添加上对应的set方法
        public void setSeasonName(String seasonName) {
            this.seasonName = seasonName;
        }
    
        public void setSeasonDesc(String seasonDesc) {
            this.seasonDesc = seasonDesc;
        }
    
        @Override
        public String toString() {
            return "Season2{" +
                    "seasonName='" + seasonName + '\'' +
                    ", seasonDesc='" + seasonDesc + '\'' +
                    '}';
        }
    }
    
    package com.enumstudy;
    
    public class SeasonTest2 {
        public static void main(String[] args) {
            Season2 autumn2 = Season2.AUTUMN;
            System.out.println(autumn2);
            System.out.println("=========================");
            autumn2.setSeasonName("蓝天");
            autumn2.setSeasonDesc("蓝天是晴朗的");
            System.out.println(autumn2);
        }
    
    }
    运行结果:
    Season2{seasonName='秋天', seasonDesc='秋天是凉爽的'}
    =========================
    Season2{seasonName='蓝天', seasonDesc='蓝天是晴朗的'}
    
    

    我们在实际项目开发过程中会经常看到返回值是enum枚举类型的方法,是通过以下这种方式来写的,比如:

    public class SeasonTest {
        public static void main(String[] args) {
         
        }
    
        .......方法
        
        public enum chooseSeason{
            SPRING("春天","春天是温暖的"),
            SUMMER("夏天","夏天是炎热的"),
            AUTUMN("秋天","秋天是凉爽的"),
            WINTER("冬天","冬天是寒冷的");
            
            //添加对应的构造方法
            private chooseSeason(String seasonName,String seasonDesc){
                this.seasonName=seasonName;
                this.seasonDesc=seasonDesc;
            }
            @Setter
            @Getter
            private String seasonName;
            @Setter
            @Getter
            private String seasonDesc;
        }
    }
    
  • 相关阅读:
    sql语句左链接left join--3张表关联
    combobox下拉框
    sql in()批量操作
    spring事务传播特性实验(2):PROPAGATION_REQUIRED实验结果与分析
    【kubernetes】kubectl logs connection refused
    k8s1.4.3安装实践记录(3)下载基础镜像
    k8s1.4.3安装实践记录(2)-k8s安装
    k8s1.4.3安装实践记录(1)-etcd、docker、flannel安装配置
    python爬虫常用数据整理函数
    django-xadmin常用内容记录
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/15727449.html
Copyright © 2011-2022 走看看