zoukankan      html  css  js  c++  java
  • Java 枚举使用总结

    目录

    1、枚举基础

      1.1、创建枚举最简单的方式

      1.2、简单使用

    2、枚举的构造方法

      2.1、使用注释方式说明

      2.2、使用构造方法

      2.3、使用带有构造器的枚举

    3、就这些了?

      3.1、需求 

      3.2、使用Map实现

      3.3、枚举结合Map

      

      

    1、枚举基础

      1.1、创建枚举最简单的方式

    package cn.ganlixin.demo.enums;
    
    /**
     * 描述:  季节枚举类
     */
    public enum  SeasonEnum {
    
        // 枚举值之间使用逗号隔开,而不是分号
        SPRING, SUMMER, AUTUMN, WINNER;
    }
    

      

      1.2、简单使用

    @Test
    public void testUseSeasonEnum() {
        System.out.println(SeasonEnum.AUTUMN);      // AUTUMN
    
        // 获取枚举类中定义的所有枚举项(每一项都是枚举,而不是字符串)
        final SeasonEnum[] values = SeasonEnum.values();
        for (SeasonEnum season : values) {
            System.out.print(season +" ");  // SPRING SUMMER AUTUMN WINTER
        }
    
        // 根据传入的字符串,获取与字符串同名的枚举项(如果没有字符串同名的枚举项,则会报错)
        final SeasonEnum winter = SeasonEnum.valueOf("WINTER");
        System.out.println(winter);         // WINTER
    
        // 枚举项的比较
        System.out.println(SeasonEnum.WINTER == SeasonEnum.WINTER); // true
        // 字符串不能直接与枚举进行比较
        //System.out.println("WINTER" == SeasonEnum.WINTER);
        // System.out.println(Objects.equals("WINTER", SeasonEnum.WINTER)); // false
    }
    

        

    2、枚举的构造方法

      2.1、使用注释方式说明

      虽然可以通过给枚举项增加注释的方式来表达枚举项的含义,但是对于打包发布后,注释是删掉的,这时就不好了

    package cn.ganlixin.demo.enums;
    
    /**
     * 描述:  季节枚举类
     */
    public enum  SeasonEnum {
    
        // 枚举值之间使用逗号隔开,使用注释的方式说明枚举项的含义
        SPRING, // 春天
        SUMMER, // 夏天
        AUTUMN, // 秋天
        WINTER; // 冬天
    }
    

      

      2.2、使用构造方法

    package cn.ganlixin.demo.enums;
    
    /**
     * 描述:  季节枚举类
     */
    public enum  SeasonEnum {
    
        // 枚举值定义。枚举值之间使用逗号隔开,使用构造方法设置
        SPRING("春天"),
        SUMMER("夏天"),
        AUTUMN("秋天"),
        WINTER("冬天");
    
        // 枚举项的说明(比如注释"春天")
        String description;
        // 还可以自己加其他字段
    
        // 创建一个构造方法
        SeasonEnum(String description) {
            this.description = description;
        }
    
        // 获取枚举项描述
        public String getDescription() {
            return description;
        }
    
    //    一般不建议提供setter,因为枚举类不应该被改变(包括信息描述)
    //    public void setDescription(String description) {
    //        this.description = description;
    //    }
    }
    

      需要注意的是,上面SeasonEnum的各部分代码顺序不能更改,也就是说枚举项定义必须在其他代码之前(包括构造方法、属性、getter)。  

      2.3、使用带有构造器的枚举

    @Test
    public void testSeasonEnumWithConstructor() {
        System.out.println(SeasonEnum.AUTUMN);                  // AUTUMN
    
        // 每一个枚举项都默认包含name方法,返回枚举项的字符串类型
        System.out.println(SeasonEnum.AUTUMN.name());           // AUTUMN
        
        // 调用方法获取枚举项的描述
        System.out.println(SeasonEnum.AUTUMN.getDescription()); // 秋天
    }
    

      

    3、就这些了?

      看完上面的定义和使用方式,你觉得枚举就这些了吗?的确,枚举就这内容,但是在真实开发工作中,还是不够的。

      

      3.1、需求1  

      比如,我想根据一个字符串,获取枚举类中同名的枚举项,但是返回的是枚举项的描述:

      伪代码如下:

    String item = "xxx";
    
    // 传入字符串获取对应的描述,而不是枚举项
    String desctiption = SeasonEnum.getDescription(item);
    

      

      3.2、使用Map实现

      一个简单的方式就是通过使用不可变Map来实现,这里就不掩饰了

      3.3、枚举结合Map

      可以使用枚举和Map结合的方式,既保留了枚举的功能,也可以使用Map的功能

    package cn.ganlixin.demo.enums;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 描述:  季节枚举类
     */
    public enum  SeasonEnum {
    
        // 枚举值之间使用逗号隔开,使用构造方法设置
        SPRING("春天"),
        SUMMER("夏天"),
        AUTUMN("秋天"),
        WINTER("冬天");
    
        // 用来存枚举项(字符串类型)与description的对应关系
        private static final Map<String, String> SeasonEnumMap = new HashMap<>();
    
        static {
            // 将枚举项的名称与描述存入map
            for (SeasonEnum season : values()) {
                SeasonEnumMap.put(season.name(), season.getDescription());
            }
        }
    
        // 枚举项的说明(比如注释"春天")
        String description;
    
        // 创建一个构造方法
        SeasonEnum(String description) {
            this.description = description;
        }
        
        // 获取枚举项描述
        public String getDescription() {
            return description;
        }
    
        /**
         * 根据字符串类型的枚举项,获取描述
         * @param season
         * @return
         */
        public static String fromSeasonName(String season) {
            return SeasonEnumMap.get(season);
        }
    }
    

      

      使用示例

    @Test
    public void testEnumWithMap() {
        System.out.println(SeasonEnum.fromSeasonName("WINTER"));     // 冬天
    
        System.out.println(SeasonEnum.fromSeasonName("NotExists"));  // null
    }
    

      

  • 相关阅读:
    育碧-彩虹六号如何绑定二次验证码/两步验证/身份验证?
    leetcode刷题-95/96/98
    leetcode刷题-94二叉树的中序遍历
    leetcode刷题-93复原IP地址
    leetcode刷题-91解码方法
    leetcode刷题-90子集 II
    leetcode刷题-89格雷编码
    leetcode刷题-88.合并两个有序数组
    leetcode刷题-86分隔链表
    leetcode刷题-82.删除排序链表中的重复元素 II
  • 原文地址:https://www.cnblogs.com/-beyond/p/11355573.html
Copyright © 2011-2022 走看看