zoukankan      html  css  js  c++  java
  • Java

    前言

    枚举是 Java1.5 引入的新特性,通过关键字 enum 来定义枚举类。


    应用

    定义

    • 关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。
    enum WeekEnum {
        Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend
    }
    

    基本Enum特性

    • 枚举类的定义
    enum WeekEnum {
        Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend;
    
        public static void main(String[] args) {
            for (WeekEnum item : WeekEnum.values()) {
                System.out.println(item.ordinal());
                System.out.println(item.name());
                System.out.println(item.getDeclaringClass());
                System.out.println(Enum.valueOf(WeekEnum.class, item.name()));
            }
        }
    }
    
    • 常用方法
    方法 说明
    values() 可以遍历enum实例,其返回enum实例的数组
    ordinal() 返回每个实例在声明时的次序
    name() 返回enum实例声明时的名称
    getDeclaringClass() 返回其所属的enum类
    Enum.valueOf() 根据给定的名称返回相应的enum实例

    Enum的静态导入

    • static import 可以将 enum 实例的标识符带入当前类,无需再用enum类型来修饰 enum 实例
    import static com.coisini.springbootlearn.WeekEnum.*;
    
    public class WeekEnumTest {
    
        public static void main(String[] args) {
            System.out.println(Monday.name()); // Monday
            System.out.println(Tuesday.name()); //Tuesday
        }
    
    }
    

    Enum中添加新方法

    • Enum 可以看做是一个常规类(除了不能继承自一个enum),enum 中可以添加方法和 main 方法。
    
    public enum WeekEnum {
    
        Monday(1, "周一"),
        Tuesday(2, "周二"),
        Wednesday(3, "周三"),
        Thursday(4, "周四"),
        Friday(5, "周五"),
        Saturday(6, "周六"),
        weekend(7, "周天");
    
        private Integer value;
        private String description;
    
        /**
         * 构造方法
         * @param value
         * @param description
         */
        WeekEnum(Integer value, String description) {
            this.value = value;
            this.description = description;
        }
    
        /**
         * 获取value
         * @return
         */
        public Integer getValue() { return this.value; }
    
        /**
         * 获取Desc
         * @return
         */
        public String getDesc() { return this.description; }
    
        /**
         * 重写ToString方法
         * @return
         */
        public String toString() {
            return this.getValue() + " " + this.getDesc();
        }
    
        public static void main(String[] args) {
            for (WeekEnum item : WeekEnum.values()) {
                System.out.println(item);
            }
        }
    
    }
    

    Switch语句中的Enum

    • 正确用法
    WeekEnum weekEnum = WeekEnum.Friday;
    
    switch (weekEnum) {
       case Friday:
           System.out.println(weekEnum);
           break;
       case Saturday:
           break;
    }
    
    • 错误用法
    WeekEnum weekEnum = WeekEnum.Friday;
    
    switch(weekEnum) {
    	// An enum switch case label must be the unqualified name of an enumeration constant
       case WeekEnum.Friday:
           break;
       default:
           break;
    }
    
    • 常规情况下必须使用 enum 类型来修饰 enum 实例,但在 case 语句中不必如此。

    Enum的继承

    • 所有的enum都继承自java.lang.Enum类,由于Java不支持多重继承,所以enum不能继承其他类,但可以实现一个或多个接口。
    public interface Period {
    
        enum WeekEnum implements Period{
            Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend
        }
    
        enum MonthEnum implements Period{
            January, February, March, April, May, June
        }
        
        class PeriodTest {
            public static void main(String[] args) {
                Period week = WeekEnum.Friday;
                Period month = MonthEnum.April;
    
                System.out.println(month + " " + week); // April Friday
            }
        }
    
    }
    

    EnumSet的使用

    • enum 中不能删除和添加元素,Java SE5 引入了EnumSet,其元素必须来自一个 enum 。
    import java.util.EnumSet;
    
    enum EnumSetTest {
        Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend;
    
        public static void main(String[] args) {
            EnumSet<EnumSetTest> points = EnumSet.noneOf(EnumSetTest.class);
            points.add(Monday);
            System.out.println(points); // [Monday]
    
            points.addAll(EnumSet.of(Tuesday, Wednesday));
            System.out.println(points); // [Monday, Tuesday, Wednesday]
    
            points = EnumSet.allOf(EnumSetTest.class);
            System.out.println(points); // [Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, weekend]
    
            points.removeAll(EnumSet.of(Monday, Tuesday));
            System.out.println(points); // [Wednesday, Thursday, Friday, Saturday, weekend]
    
            points = EnumSet.complementOf(points);
            System.out.println(points); // [Monday, Tuesday]
        }
    }
    

    EnumMap的使用

    • EnumMap 是一种特殊的 Map,其 key 值必须来自一个 enum,enum 实例定义的次序决定了其在EnumMap中的顺序。
    import java.util.EnumMap;
    import java.util.Map;
    
    public enum EnumMapTest {
        MON, TUE, WED, THU, FRI, SAT, WEE;
    
        public static void main(String[] args) {
            EnumMap<EnumMapTest, String> enumMap = new EnumMap<EnumMapTest, String>(EnumMapTest.class);
            enumMap.put(MON, "Monday");
            enumMap.put(TUE, "Tuesday");
    
            for (Map.Entry<EnumMapTest, String> em : enumMap.entrySet()) {
                System.out.println(em.getKey() + " " + em.getValue()); // MON Monday TUE Tuesday
            }
        }
    }
    

    常量相关方法

    • enum 允许为 enum 实例编写方法,为每个 enum 实例赋予不同的行为,要实现常量的相关方法需要为 enum 定义- 实现 abstract 方法。
    public enum EnumAbstract {
        MON {
            void getDetail() {
                System.out.println("Monday");
            }
        },
        TUE {
            void getDetail() {
                System.out.println("Tuesday");
            }
        },
        WED {
            void getDetail() {
                System.out.println("Wednesday");
            }
        };
    
        abstract void getDetail();
    
        public static void main(String[] args) {
            for (EnumAbstract ea : EnumAbstract.values()) {
                ea.getDetail();
            }
        }
    
    }
    

    枚举值向枚举类型转换

    import java.util.stream.Stream;
    
    public enum WeekEnum {
    
        Monday(1, "周一"),
        Tuesday(2, "周二"),
        Wednesday(3, "周三"),
        Thursday(4, "周四"),
        Friday(5, "周五"),
        Saturday(6, "周六"),
        weekend(7, "周天");
    
        private Integer value;
        private String description;
    
        /**
         * 构造方法
         * @param value
         * @param description
         */
        WeekEnum(Integer value, String description) {
            this.value = value;
            this.description = description;
        }
    
        /**
         * 枚举值向枚举类型转换
         * @param value
         * @return
         */
        public static WeekEnum toWeekEnum(int value) {
            return Stream.of(WeekEnum.values())
                    .filter(item -> item.value == value)
                    .findAny()
                    .orElse(null);
        }
    
        public static void main(String[] args) {
            System.out.println(WeekEnum.toWeekEnum(1)); // Monday
        }
    
    }
    

    - End -
    梦想是咸鱼
    关注一下吧
    以上为本篇文章的主要内容,希望大家多提意见,如果喜欢记得点个推荐哦
    作者:Maggieq8324
    本文版权归作者和博客园共有,欢迎转载,转载时保留原作者和文章地址即可。
  • 相关阅读:
    基于Visual C++2013拆解世界五百强面试题--题13-找最大公共子字符串
    基于Visual C++2013拆解世界五百强面试题--题12-进制转换
    Color颜色对照表
    根据选择打开相应的程序
    复制一个5G文件只需要两秒,全网最牛方法!
    判断一个男人穷还是富,只看这几点!
    判断一个男人穷还是富,只看这几点!
    判断一个男人穷还是富,只看这几点!
    16年国庆假期期间兼职所悟
    16年国庆假期期间兼职所悟
  • 原文地址:https://www.cnblogs.com/maggieq8324/p/15177334.html
Copyright © 2011-2022 走看看