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),而没有检查输入是否合法。
希望这次讲解能帮你更好地理解 枚举的特殊方法及其应用场景!🚀 🎯









网友评论