Java - Enum 枚举类型

本文详细介绍了Java中枚举(Enum)的基本概念、定义方式、常用方法、静态导入、继承与扩展,以及如何在Switch语句、EnumSet和EnumMap中使用。涵盖了Enum的常量方法和值的转换,适合初学者和进阶者阅读。
摘要由CSDN通过智能技术生成

前言

枚举是 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 -
- 个人学习笔记 -
- 仅供参考 -

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Maggieq8324

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值