java枚举类型-Enum

 更新时间:2021年08月24日 14:07:12   作者:Maggieq8324  
本文详细介绍了 Java1.5 引入的新特性枚举中的关键字enum,运用大量的代码加以解释,相信可以帮助到正在学习该知识的小伙伴,大家可以参考一下

前言

枚举是 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
    }

}

以上就是java枚举类型-Enum的详细内容,更多关于java Enum的资料请关注脚本之家其它相关文章!

相关文章

  • Java多线程Semaphore工具的使用详解

    Java多线程Semaphore工具的使用详解

    Semaphore 是一种用于控制线程并发访问数的同步工具。它通过维护一定数量的许可证来限制对共享资源的访问,许可证的数量就是可以同时访问共享资源的线程数目,需要的朋友可以参考下
    2023-05-05
  • 详解解决IDEA2020.1版本的lombok插件问题

    详解解决IDEA2020.1版本的lombok插件问题

    这篇文章主要介绍了详解解决IDEA2020.1版本的lombok插件问题。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Java泛型常见面试题(面试必问)

    Java泛型常见面试题(面试必问)

    泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。java泛型知识点也是Java开发岗位必问的一个话题,今天小编就给大家普及下Java泛型常见面试题,感兴趣的朋友一起看看吧
    2021-06-06
  • SpringSecurity入门使用教程

    SpringSecurity入门使用教程

    ​ Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,它是用于保护基于Spring的应用程序的实际标准,这篇文章主要介绍了如何使用SpringSecurity,需要的朋友可以参考下
    2023-12-12
  • Java+Swing实现中国象棋游戏

    Java+Swing实现中国象棋游戏

    这篇文章将通过Java+Swing实现经典的中国象棋游戏。文中可以实现开始游戏,悔棋,退出等功能。感兴趣的小伙伴可以跟随小编一起动手试一试
    2022-02-02
  • SpringAOP 设置注入的实现步骤

    SpringAOP 设置注入的实现步骤

    这篇文章主要介绍了SpringAOP 设置注入的实现步骤,帮助大家更好的理解和学习使用Spring框架,感兴趣的朋友可以了解下
    2021-05-05
  • 一文搞懂如何实现Java,Spring动态启停定时任务

    一文搞懂如何实现Java,Spring动态启停定时任务

    定时任务的应用场景十分广泛,如定时清理文件、定时生成报表、定时数据同步备份等。本文将教你实现Java、Spring动态启停定时任务,感兴趣的可以学习一下
    2022-06-06
  • 用java实现冒泡排序算法

    用java实现冒泡排序算法

    两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止
    2013-01-01
  • Dependency ‘XXX:‘ not found问题的三步解决

    Dependency ‘XXX:‘ not found问题的三步解决

    这篇文章主要介绍了Dependency ‘XXX:‘ not found问题的三步解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • idea创建的idea项目时springframework出现红色的原因和解决方法

    idea创建的idea项目时springframework出现红色的原因和解决方法

    当使用 IntelliJ IDEA 创建 Spring Framework 项目时,springframework 出现红色可能是因为相关的 Spring Framework 依赖没有正确加载或项目的配置有问题,本文给大家介绍了一些常见的原因和解决方法,需要的朋友可以参考下
    2023-09-09

最新评论