美文网首页
79. Java 枚举类 - 枚举的特殊方法

79. Java 枚举类 - 枚举的特殊方法

作者: Cache技术分享 | 来源:发表于2025-05-15 07:23 被阅读0次

79. Java 枚举类 - 枚举的特殊方法

在 Java 中,所有 枚举自动继承了一些有用的方法。这些方法包括:

name() - 获取枚举的名称
ordinal() - 获取枚举的索引
values() - 获取所有枚举值的数组
valueOf(String) - 通过字符串获取对应的枚举值
compareTo() - 比较两个枚举的顺序
枚举可以排序(实现 Comparable 接口)


1️⃣ name() 方法 - 获取枚举名称

System.out.println(DayOfWeek.MONDAY.name());

💡 输出

MONDAY

📌 解析

  • name() 返回枚举的名称,即 enum 里定义的名字。
  • MONDAY.name() 返回 "MONDAY",跟 toString() 默认行为相同。

2️⃣ ordinal() 方法 - 获取枚举索引

System.out.println(DayOfWeek.MONDAY.ordinal());

💡 输出

0

📌 解析

  • ordinal() 返回 枚举在声明中的位置(从 0 开始)
  • MONDAY.ordinal() 返回 0TUESDAY.ordinal() 返回 1,以此类推。

注意
不建议依赖 ordinal() 作为业务逻辑,因为枚举顺序如果变了,ordinal() 值也会变,可能引发 Bug!


3️⃣ values() 方法 - 获取所有枚举值

DayOfWeek[] days = DayOfWeek.values();
for (DayOfWeek day : days) {
    System.out.println(day);
}

💡 输出

MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

📌 解析

  • values() 返回一个数组,包含所有枚举值
  • 常用于遍历枚举(比如用 for 循环)。

4️⃣ valueOf(String) 方法 - 通过名称获取枚举值

DayOfWeek monday = DayOfWeek.valueOf("MONDAY");
System.out.println(monday);

💡 输出

MONDAY

📌 解析

  • valueOf(String name) 根据枚举名称返回对应的枚举值
  • 如果传入的字符串和枚举常量的名称不匹配,会抛出 IllegalArgumentException
DayOfWeek invalid = DayOfWeek.valueOf("Funday");  // ❌ 报错!

💥 错误

Exception in thread "main" java.lang.IllegalArgumentException: No enum constant DayOfWeek.Funday

💡 解决方案 如果字符串可能无效,可以使用 try-catch

try {
    DayOfWeek day = DayOfWeek.valueOf("Funday");
    System.out.println(day);
} catch (IllegalArgumentException e) {
    System.out.println("Invalid day name!");
}

💡 输出

Invalid day name!

5️⃣ compareTo() 方法 - 枚举的排序

Java 枚举默认实现了 Comparable 接口,可以按定义顺序进行比较:

public void compareDayOfWeek(DayOfWeek dayOfWeek) {
    int comparison = dayOfWeek.compareTo(DayOfWeek.WEDNESDAY);
    if (comparison < 0) {
        System.out.println("It's before the middle of the work week.");
    } else if (comparison > 0) {
        System.out.println("It's after the middle of the work week.");
    } else {
        System.out.println("It's the middle of the work week.");
    }
}

💡 示例调用

compareDayOfWeek(DayOfWeek.TUESDAY);
compareDayOfWeek(DayOfWeek.WEDNESDAY);
compareDayOfWeek(DayOfWeek.FRIDAY);

💡 输出

It's before the middle of the work week.
It's the middle of the work week.
It's after the middle of the work week.

📌 解析

  • compareTo()比较两个枚举的 ordinal() 值:
    • 如果 小于 0,说明 dayOfWeekWEDNESDAY 之前。
    • 如果 大于 0,说明 dayOfWeekWEDNESDAY 之后。

6️⃣ 枚举排序

因为枚举实现了 Comparable 接口,所以可以直接用于排序:

List<DayOfWeek> days = new ArrayList<>(List.of(DayOfWeek.FRIDAY, DayOfWeek.TUESDAY, DayOfWeek.SATURDAY));
Collections.sort(days);
System.out.println(days);

💡 输出

[TUESDAY, FRIDAY, SATURDAY]

📌 解析

  • Collections.sort(days) 按照 ordinal() 进行排序
  • TUESDAY.ordinal() = 1, FRIDAY.ordinal() = 4, SATURDAY.ordinal() = 5,所以 TUESDAY 先出现。

7️⃣ 自定义排序(按字段排序)

如果我们想按工作日 vs. 周末来排序,而不是默认的 ordinal(),我们可以使用 Comparator

辑ublic enum DayOfWeek {
    MONDAY("MON", true), TUESDAY("TUE", true), WEDNESDAY("WED", true),
    THURSDAY("THU", true), FRIDAY("FRI", true),
    SATURDAY("SAT", false), SUNDAY("SUN", false);

    private final String abbreviation;
    private final boolean isWeekday;

    DayOfWeek(String abbreviation, boolean isWeekday) {
        this.abbreviation = abbreviation;
        this.isWeekday = isWeekday;
    }

    public boolean isWeekday() {
        return isWeekday;
    }
}

public class EnumSortExample {
    public static void main(String[] args) {
        List<DayOfWeek> days = new ArrayList<>(List.of(DayOfWeek.FRIDAY, DayOfWeek.TUESDAY, DayOfWeek.SATURDAY));

        // 按 "是否是工作日" 进行排序
        days.sort(Comparator.comparing(DayOfWeek::isWeekday));

        System.out.println(days);
    }
}

💡 输出

[SATURDAY, TUESDAY, FRIDAY]

📌 解析

  • isWeekday() 返回的 true/false 进行排序
  • false(周末)会排在前面,所以 SATURDAY 先出现。

🔹 总结

方法 作用
name() 返回枚举的名称(字符串)
ordinal() 返回枚举的索引(从 0 开始)
values() 返回枚举的所有值(数组)
valueOf(String) 通过名称获取枚举值(大小写敏感)
compareTo() ordinal() 进行顺序比较
Collections.sort() ordinal() 进行默认排序
Comparator.comparing() 按自定义字段排序

什么时候使用这些方法?

适合使用的情况

  • 需要获取枚举的所有值values()
  • 需要根据名称查找枚举valueOf()
  • 需要比较枚举的先后顺序compareTo()
  • 需要对枚举列表排序Collections.sort() / Comparator

不适合使用的情况

  • 业务逻辑中依赖 ordinal()(因为枚举顺序可能会变)。
  • 滥用 valueOf(String),而没有检查输入是否合法

希望这次讲解能帮你更好地理解 枚举的特殊方法及其应用场景!🚀 🎯

相关文章

  • Java枚举类

    枚举其实是个特殊的 Java 类,创建枚举需用enum关键字,枚举类都是java.lang.Enum的子类,jav...

  • 5 枚举类

    5.1 枚举类概述 Java5新增的enum关键字,用于定义枚举类。 枚举类是特殊的类,可以有自己的成员变...

  • java拾遗第一天

    枚举类(enum) 1.1 枚举类就是一个特殊的java类 1.2 枚举类的实例(对象)个数是固定的,一旦创建完成...

  • 枚举

    定义枚举类 可以在枚举中定义普通方法和抽象方法. 也同样可在枚举类中定义属性,构造方法. 实现原理 Java文件在...

  • Java枚举

    枚举 普通方式定义(int枚举模式) 枚举方式 Enum抽象类常见方法 Enum是所有 Java 语言枚举类型的公...

  • Java Enum

    Enum 类型的介绍 枚举类型是Java5新增的特性之一,枚举是一种特殊类型的类,其枚举的每一个值都是该枚举类的一...

  • 枚举

    枚举是Java1.5引入的新特性,通过关键字 enum 来定义枚举类。 枚举类是一种特殊类,它和普通类一样可以使用...

  • 探秘 Java 中的枚举(enum)

    本文包括:枚举由来如何使用?枚举类特性单例设计模式定义特殊结构枚举星期输出中文的案例枚举类API 枚举(enum)...

  • Java枚举

    Java中的每个枚举都是java.lang.Enum的final子类,枚举类中的每个枚举常量都是该枚举类的一个实例...

  • 枚举和类

    枚举和类的异同 相同点: 枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量、成员方法、构造器。 枚举类也可...

网友评论

      本文标题:79. Java 枚举类 - 枚举的特殊方法

      本文链接:https://www.haomeiwen.com/subject/srdiijtx.html