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

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),而没有检查输入是否合法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yaoxin521123

谢谢您的支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值