文章目录
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()
返回0
,TUESDAY.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,说明
dayOfWeek
在WEDNESDAY
之前。 - 如果 大于 0,说明
dayOfWeek
在WEDNESDAY
之后。
- 如果 小于 0,说明
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)
,而没有检查输入是否合法。
希望这次讲解能帮你更好地理解 枚举的特殊方法及其应用场景!🚀 🎯