前言
在软件开发中,我们经常遇到需要定义固定集合的场景,比如星期、月份、状态码等。早期开发者通常使用public static final
关键字定义常量,但这种方式存在类型不安全、缺乏命名空间等问题。Java 5引入的枚举(Enum)类型,完美解决了这些问题,成为Java语言中不可或缺的特性。
一、关于
1.1 简介
Java Enum(枚举)是一种特殊的类 ,用于定义固定数量的命名常量集合。它继承自java.lang.Enum
类,通过关键字enum
声明,能够将相关常量组织在一个逻辑单元中,提高代码的可读性和可维护性。例如星期几、季节、状态码等场景都非常适合使用枚举。
arduino
public enum Season {
SPRING, SUMMER, AUTUMN, WINTER
}
1.2 发展历程
- Java 1.0-1.4 :使用
public static final
常量模拟枚举 - Java 5 (2004) :正式引入枚举类型
- Java 8 (2014) :枚举支持Lambda和方法引用
- Java 16 (2021) :增强的模式匹配支持枚举
在Java 1.5之前,开发者通常通过接口或类定义静态常量来模拟枚举功能。例如:
类中定义:
arduino
public static final int MONDAY = 1;
public static final int TUESDAY = 2;
接口中定义:
ini
public interface Color {
int RED = 1;
int GREEN = 2;
int BLUE = 3;
}
这种方式存在类型不安全 (如允许任意整数传入)和代码冗余 的问题。Java 1.5引入enum
关键字后,枚举类不仅解决了这些问题,还提供了内置的方法(如values()
、compareTo()
),极大简化了开发流程。
1.3 核心特点
-
类型安全 枚举变量只能接受定义好的常量,避免无效值的传入。例如:
inipublic enum Day { MONDAY, TUESDAY } Day today = Day.MONDAY; // 合法 Day invalidDay = "WEDNESDAY"; // 编译错误
-
不可变性 枚举实例是
public static final
的,一旦定义无法修改。 -
继承与限制
- 所有枚举类默认继承
java.lang.Enum
,不能显式继承其他类。 - 枚举可以实现接口,但无法被其他类继承。
- 所有枚举类默认继承
-
内置方法 枚举类自动继承以下方法:
name()
: 返回枚举常量的名称(如Day.MONDAY.name()
→"MONDAY"
)。ordinal()
: 返回枚举常量的序号(从0开始)。values()
: 以数组形式返回所有枚举常量。valueOf(String name)
: 根据名称获取枚举实例(未找到时抛出异常)。
1.4 应用场景
-
状态机管理 表示有限状态集合,如订单状态、设备状态。
swiftpublic enum OrderStatus { PENDING, PROCESSING, COMPLETED, CANCELED; }
-
业务配置项 定义固定分类或规则,如用户角色、权限等级。
arduinopublic enum UserRole { ADMIN, USER, GUEST; }
-
数据字典映射 关联代码、描述等信息,用于国际化或数据库字段映射。
arduinopublic enum ErrorCode { SUCCESS(200, "操作成功"), FAILURE(500, "操作失败"); private final int code; private final String message; ErrorCode(int code, String message) { this.code = code; this.message = message; } }
二、常用方法
方法 | 功能描述 | 示例 |
---|---|---|
values() |
获取所有枚举值 | Weekday.values() |
valueOf() |
根据名称获取枚举 | Weekday.valueOf("MONDAY") |
name() |
获取枚举常量名 | Weekday.MONDAY.name() |
ordinal() |
获取声明序号 | Weekday.MONDAY.ordinal() |
compareTo() |
比较枚举顺序 | MONDAY.compareTo(FRIDAY) |
toString() |
默认返回name() | 可重写提供自定义输出 |
三、原理分析
这里以一个星期枚举分析:
3.1 使用常量
首先看常量,这段代码,是在enum没引入之前:
arduino
public class DayDemo {
public static final int MONDAY =1;
public static final int TUESDAY=2;
public static final int WEDNESDAY=3;
public static final int THURSDAY=4;
public static final int FRIDAY=5;
public static final int SATURDAY=6;
public static final int SUNDAY=7;
}
上述的常量定义常量的方式称为int枚举模式,这样的定义方式并没有什么错,但它存在许多不足:
- 如在类型安全和使用方便性上并没有多少好处
- 如果存在定义int值相同的变量,混淆的几率还是很大的,编译器也不会提出任何警告
- 操作上,比如我要拿到所有的枚举值,或者根据枚举值拿到具体的名字等都非常的不方便 因此这种方式在枚举出现后并不提倡,现在我们利用枚举类型来重新定义上述的常量,同时也感受一把枚举定义的方式,如下定义周一到周日的常量
3.2 新建枚举
使用枚举实现:
arduino
//枚举类型,使用关键字enum
public enum Day {
MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
相当简洁,使用起来也是异常的方便
3.3 编译java文件
csharp
D:\Enviroment\java\jdk-17.0.11\bin\java.exe -Dmaven.multiModuleProjectDirectory=D:\code\deep-seek-r1 "-Dmaven.home=D:\Enviroment\IntelliJ IDEA 2021.2.2\plugins\maven\lib\maven3" "-Dclassworlds.conf=D:\Enviroment\IntelliJ IDEA 2021.2.2\plugins\maven\lib\maven3\bin\m2.conf" "-Dmaven.ext.class.path=D:\Enviroment\IntelliJ IDEA 2021.2.2\plugins\maven\lib\maven-event-listener.jar" "-javaagent:D:\Enviroment\IntelliJ IDEA 2021.2.2\lib\idea_rt.jar=63124:D:\Enviroment\IntelliJ IDEA 2021.2.2\bin" -Dfile.encoding=UTF-8 -classpath "D:\Enviroment\IntelliJ IDEA 2021.2.2\plugins\maven\lib\maven3\boot\plexus-classworlds-2.6.0.jar;D:\Enviroment\IntelliJ IDEA 2021.2.2\plugins\maven\lib\maven3\boot\plexus-classworlds.license" org.codehaus.classworlds.Launcher -Didea.version=2021.2.2 -s D:\Enviroment\maven\apache-maven-3.6.3\conf\settings.xml -Dmaven.repo.local=D:\repository compile
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< com.example:deep-seek-r1 >----------------------
[INFO] Building deep-seek-r1 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.3.1:resources (default-resources) @ deep-seek-r1 ---
[INFO] Copying 1 resource from src\main\resources to target\classes
[INFO] Copying 0 resource from src\main\resources to target\classes
[INFO]
[INFO] --- maven-compiler-plugin:3.13.0:compile (default-compile) @ deep-seek-r1 ---
[INFO] Recompiling the module because of changed source code.
[INFO] Compiling 5 source files with javac [debug parameters release 17] to target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.265 s
[INFO] Finished at: 2025-08-17T11:38:10+08:00
[INFO] ------------------------------------------------------------------------
Process finished with exit code 0
需要看真身,首先我们得看看编译后的.class文件。
通过maven编译后的.class文件如下:
有乱码,通过notepad改为utf-8编码
3.4 反编译
使用"javap -v -p "来反编译它
arduino
javap -v -p Day.class
yaml
PS D:\code\deep-seek-r1\target\classes\com\example\deepseekr1\enumDemo> javap -v -p Day.class
Classfile /D:/code/deep-seek-r1/target/classes/com/example/deepseekr1/enumDemo/Day.class
Last modified 2025年8月17日; size 1412 bytes
SHA-256 checksum a749ddc77754adfcc181933985c7985d247925e669c6d04326611fc1e36e6d26
Compiled from "Day.java"
public final class com.example.deepseekr1.enumDemo.Day extends java.lang.Enum<com.example.deepseekr1.enumDemo.Day>
minor version: 0
major version: 61
flags: (0x4031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER, ACC_ENUM
this_class: #1 // com/example/deepseekr1/enumDemo/Day
super_class: #35 // java/lang/Enum
interfaces: 0, fields: 8, methods: 5, attributes: 2
Constant pool:
#1 = Class #2 // com/example/deepseekr1/enumDemo/Day
#2 = Utf8 com/example/deepseekr1/enumDemo/Day
#3 = Fieldref #1.#4 // com/example/deepseekr1/enumDemo/Day.MONDAY:Lcom/example/deepseekr1/enumDemo/Day;
#4 = NameAndType #5:#6 // MONDAY:Lcom/example/deepseekr1/enumDemo/Day;
#5 = Utf8 MONDAY
#6 = Utf8 Lcom/example/deepseekr1/enumDemo/Day;
#7 = Fieldref #1.#8 // com/example/deepseekr1/enumDemo/Day.TUESDAY:Lcom/example/deepseekr1/enumDemo/Day;
#8 = NameAndType #9:#6 // TUESDAY:Lcom/example/deepseekr1/enumDemo/Day;
#9 = Utf8 TUESDAY
#10 = Fieldref #1.#11 // com/example/deepseekr1/enumDemo/Day.WEDNESDAY:Lcom/example/deepseekr1/enumDemo/Day;
#11 = NameAndType #12:#6 // WEDNESDAY:Lcom/example/deepseekr1/enumDemo/Day;
#12 = Utf8 WEDNESDAY
#13 = Fieldref #1.#14 // com/example/deepseekr1/enumDemo/Day.THURSDAY:Lcom/example/deepseekr1/enumDemo/Day;
#14 = NameAndType #15:#6 // THURSDAY:Lcom/example/deepseekr1/enumDemo/Day;
#15 = Utf8 THURSDAY
#16 = Fieldref #1.#17 // com/example/deepseekr1/enumDemo/Day.FRIDAY:Lcom/example/deepseekr1/enumDemo/Day;
#17 = NameAndType #18:#6 // FRIDAY:Lcom/example/deepseekr1/enumDemo/Day;
#18 = Utf8 FRIDAY
#19 = Fieldref #1.#20 // com/example/deepseekr1/enumDemo/Day.SATURDAY:Lcom/example/deepseekr1/enumDemo/Day;
#20 = NameAndType #21:#6 // SATURDAY:Lcom/example/deepseekr1/enumDemo/Day;
#21 = Utf8 SATURDAY
#22 = Fieldref #1.#23 // com/example/deepseekr1/enumDemo/Day.SUNDAY:Lcom/example/deepseekr1/enumDemo/Day;
#23 = NameAndType #24:#6 // SUNDAY:Lcom/example/deepseekr1/enumDemo/Day;
#24 = Utf8 SUNDAY
#25 = Fieldref #1.#26 // com/example/deepseekr1/enumDemo/Day.$VALUES:[Lcom/example/deepseekr1/enumDemo/Day;
#26 = NameAndType #27:#28 // $VALUES:[Lcom/example/deepseekr1/enumDemo/Day;
#27 = Utf8 $VALUES
#28 = Utf8 [Lcom/example/deepseekr1/enumDemo/Day;
#29 = Methodref #30.#31 // "[Lcom/example/deepseekr1/enumDemo/Day;".clone:()Ljava/lang/Object;
#30 = Class #28 // "[Lcom/example/deepseekr1/enumDemo/Day;"
#31 = NameAndType #32:#33 // clone:()Ljava/lang/Object;
#32 = Utf8 clone
#33 = Utf8 ()Ljava/lang/Object;
#34 = Methodref #35.#36 // java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
#35 = Class #37 // java/lang/Enum
#36 = NameAndType #38:#39 // valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
#37 = Utf8 java/lang/Enum
#38 = Utf8 valueOf
#39 = Utf8 (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
#40 = Methodref #35.#41 // java/lang/Enum."<init>":(Ljava/lang/String;I)V
#41 = NameAndType #42:#43 // "<init>":(Ljava/lang/String;I)V
#42 = Utf8 <init>
#43 = Utf8 (Ljava/lang/String;I)V
#44 = String #5 // MONDAY
#45 = Methodref #1.#41 // com/example/deepseekr1/enumDemo/Day."<init>":(Ljava/lang/String;I)V
#46 = String #9 // TUESDAY
#47 = String #12 // WEDNESDAY
#48 = String #15 // THURSDAY
#49 = String #18 // FRIDAY
#50 = String #21 // SATURDAY
#51 = String #24 // SUNDAY
#52 = Methodref #1.#53 // com/example/deepseekr1/enumDemo/Day.$values:()[Lcom/example/deepseekr1/enumDemo/Day;
#53 = NameAndType #54:#55 // $values:()[Lcom/example/deepseekr1/enumDemo/Day;
#54 = Utf8 $values
#55 = Utf8 ()[Lcom/example/deepseekr1/enumDemo/Day;
#56 = Utf8 values
#57 = Utf8 Code
#58 = Utf8 LineNumberTable
#59 = Utf8 (Ljava/lang/String;)Lcom/example/deepseekr1/enumDemo/Day;
#60 = Utf8 LocalVariableTable
#61 = Utf8 name
#62 = Utf8 Ljava/lang/String;
#63 = Utf8 MethodParameters
#64 = Utf8 this
#65 = Utf8 $enum$name
#66 = Utf8 $enum$ordinal
#67 = Utf8 Signature
#68 = Utf8 ()V
#69 = Utf8 <clinit>
#70 = Utf8 Ljava/lang/Enum<Lcom/example/deepseekr1/enumDemo/Day;>;
#71 = Utf8 SourceFile
#72 = Utf8 Day.java
{
//枚举类中定义的常量,在字节码层面上的反映
public static final com.example.deepseekr1.enumDemo.Day MONDAY;
descriptor: Lcom/example/deepseekr1/enumDemo/Day;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
public static final com.example.deepseekr1.enumDemo.Day TUESDAY;
descriptor: Lcom/example/deepseekr1/enumDemo/Day;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
public static final com.example.deepseekr1.enumDemo.Day WEDNESDAY;
descriptor: Lcom/example/deepseekr1/enumDemo/Day;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
public static final com.example.deepseekr1.enumDemo.Day THURSDAY;
descriptor: Lcom/example/deepseekr1/enumDemo/Day;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
public static final com.example.deepseekr1.enumDemo.Day FRIDAY;
descriptor: Lcom/example/deepseekr1/enumDemo/Day;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
public static final com.example.deepseekr1.enumDemo.Day SATURDAY;
descriptor: Lcom/example/deepseekr1/enumDemo/Day;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
public static final com.example.deepseekr1.enumDemo.Day SUNDAY;
descriptor: Lcom/example/deepseekr1/enumDemo/Day;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
private static final com.example.deepseekr1.enumDemo.Day[] $VALUES;
descriptor: [Lcom/example/deepseekr1/enumDemo/Day;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
//枚举数组,这个数组供values方法使用,用于返回枚对象数组
public static com.example.deepseekr1.enumDemo.Day[] values();
descriptor: ()[Lcom/example/deepseekr1/enumDemo/Day;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=0, args_size=0
0: getstatic #25 // Field $VALUES:[Lcom/example/deepseekr1/enumDemo/Day;
3: invokevirtual #29 // Method "[Lcom/example/deepseekr1/enumDemo/Day;".clone:()Ljava/lang/Object;
6: checkcast #30 // class "[Lcom/example/deepseekr1/enumDemo/Day;"
9: areturn
LineNumberTable:
line 4: 0
//它所完成的功能就是根据传入的字符串,调用父类的valueOf方法返回对应的枚举常量
public static com.example.deepseekr1.enumDemo.Day valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/example/deepseekr1/enumDemo/Day;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=1, args_size=1
0: ldc #1 // class com/example/deepseekr1/enumDemo/Day
2: aload_0
3: invokestatic #34 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
6: checkcast #1 // class com/example/deepseekr1/enumDemo/Day
9: areturn
LineNumberTable:
line 4: 0
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 name Ljava/lang/String;
MethodParameters:
Name Flags
name mandated
private com.example.deepseekr1.enumDemo.Day();
descriptor: (Ljava/lang/String;I)V
flags: (0x0002) ACC_PRIVATE
Code:
stack=3, locals=3, args_size=3
0: aload_0
1: aload_1
2: iload_2
3: invokespecial #40 // Method java/lang/Enum."<init>":(Ljava/lang/String;I)V
6: return
LineNumberTable:
line 4: 0
LocalVariableTable:
Start Length Slot Name Signature
0 7 0 this Lcom/example/deepseekr1/enumDemo/Day;
MethodParameters:
Name Flags
$enum$name synthetic
$enum$ordinal synthetic
Signature: #68 // ()V
private static com.example.deepseekr1.enumDemo.Day[] $values();
descriptor: ()[Lcom/example/deepseekr1/enumDemo/Day;
flags: (0x100a) ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
Code:
stack=4, locals=0, args_size=0
0: bipush 7
2: anewarray #1 // class com/example/deepseekr1/enumDemo/Day
5: dup
6: iconst_0
7: getstatic #3 // Field MONDAY:Lcom/example/deepseekr1/enumDemo/Day;
10: aastore
11: dup
12: iconst_1
13: getstatic #7 // Field TUESDAY:Lcom/example/deepseekr1/enumDemo/Day;
16: aastore
17: dup
18: iconst_2
19: getstatic #10 // Field WEDNESDAY:Lcom/example/deepseekr1/enumDemo/Day;
22: aastore
23: dup
24: iconst_3
25: getstatic #13 // Field THURSDAY:Lcom/example/deepseekr1/enumDemo/Day;
28: aastore
29: dup
30: iconst_4
31: getstatic #16 // Field FRIDAY:Lcom/example/deepseekr1/enumDemo/Day;
34: aastore
35: dup
36: iconst_5
37: getstatic #19 // Field SATURDAY:Lcom/example/deepseekr1/enumDemo/Day;
40: aastore
41: dup
42: bipush 6
44: getstatic #22 // Field SUNDAY:Lcom/example/deepseekr1/enumDemo/Day;
47: aastore
48: areturn
LineNumberTable:
line 4: 0
static {};
descriptor: ()V
flags: (0x0008) ACC_STATIC
Code:
stack=4, locals=0, args_size=0
0: new #1 // class com/example/deepseekr1/enumDemo/Day
3: dup
4: ldc #44 // String MONDAY
6: iconst_0
7: invokespecial #45 // Method "<init>":(Ljava/lang/String;I)V
10: putstatic #3 // Field MONDAY:Lcom/example/deepseekr1/enumDemo/Day;
13: new #1 // class com/example/deepseekr1/enumDemo/Day
16: dup
17: ldc #46 // String TUESDAY
19: iconst_1
20: invokespecial #45 // Method "<init>":(Ljava/lang/String;I)V
23: putstatic #7 // Field TUESDAY:Lcom/example/deepseekr1/enumDemo/Day;
26: new #1 // class com/example/deepseekr1/enumDemo/Day
29: dup
30: ldc #47 // String WEDNESDAY
32: iconst_2
33: invokespecial #45 // Method "<init>":(Ljava/lang/String;I)V
36: putstatic #10 // Field WEDNESDAY:Lcom/example/deepseekr1/enumDemo/Day;
39: new #1 // class com/example/deepseekr1/enumDemo/Day
42: dup
43: ldc #48 // String THURSDAY
45: iconst_3
46: invokespecial #45 // Method "<init>":(Ljava/lang/String;I)V
49: putstatic #13 // Field THURSDAY:Lcom/example/deepseekr1/enumDemo/Day;
52: new #1 // class com/example/deepseekr1/enumDemo/Day
55: dup
56: ldc #49 // String FRIDAY
58: iconst_4
59: invokespecial #45 // Method "<init>":(Ljava/lang/String;I)V
62: putstatic #16 // Field FRIDAY:Lcom/example/deepseekr1/enumDemo/Day;
65: new #1 // class com/example/deepseekr1/enumDemo/Day
68: dup
69: ldc #50 // String SATURDAY
71: iconst_5
72: invokespecial #45 // Method "<init>":(Ljava/lang/String;I)V
75: putstatic #19 // Field SATURDAY:Lcom/example/deepseekr1/enumDemo/Day;
78: new #1 // class com/example/deepseekr1/enumDemo/Day
81: dup
82: ldc #51 // String SUNDAY
84: bipush 6
86: invokespecial #45 // Method "<init>":(Ljava/lang/String;I)V
89: putstatic #22 // Field SUNDAY:Lcom/example/deepseekr1/enumDemo/Day;
92: invokestatic #52 // Method $values:()[Lcom/example/deepseekr1/enumDemo/Day;
95: putstatic #25 // Field $VALUES:[Lcom/example/deepseekr1/enumDemo/Day;
98: return
LineNumberTable:
line 5: 0
line 6: 39
line 4: 92
}
Signature: #70 // Ljava/lang/Enum<Lcom/example/deepseekr1/enumDemo/Day;>;
SourceFile: "Day.java"
可以发现它在静态块中总共完成了两件事情:
(1)实例化枚举类并赋值给枚举实例
(2)创建引用类型的数组,并为数组赋值,这也是values方法能够得到枚举数组的原因。
由于枚举类是继承自"java.lang.Enum"类的,所以它自动的就继承了该类的一些方法:
四、示例
示例1-星期
csharp
public class EnumDemo {
public enum Day {
MONDAY, TUESDAY, WEDNESDAY;
}
public static void main(String[] args) {
// 遍历枚举常量
for (Day day : Day.values()) {
System.out.println("Name: " + day.name() + ", Ordinal: " + day.ordinal());
}
// 根据名称获取枚举
Day tuesday = Day.valueOf("TUESDAY");
System.out.println("Tuesday's ordinal: " + tuesday.ordinal());
// 比较枚举
System.out.println("MONDAY vs TUESDAY: " + Day.MONDAY.compareTo(Day.TUESDAY));
}
}
拓展
示例2---星期多字段
csharp
public class EnumExample {
public enum Day {
MONDAY(1, "星期一"),
TUESDAY(2, "星期二"),
WEDNESDAY(3, "星期三"),
THURSDAY(4, "星期四"),
FRIDAY(5, "星期五"),
SATURDAY(6, "星期六"),
SUNDAY(7, "星期日");
private final int code;
private final String desc;
Day(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public String getDesc() {
return desc;
}
}
public static void main(String[] args) {
// ✅ 1. 使用 values() 遍历枚举常量
for (Day day : Day.values()) {
System.out.printf("Code: %d, Name: %s, Desc: %s, Ordinal: %d%n",
day.getCode(), day.name(), day.getDesc(), day.ordinal());
}
// ✅ 2. 使用 valueOf(String name) 根据名称获取枚举常量
try {
Day wednesday = Day.valueOf("WEDNESDAY");
System.out.println("Wednesday's Code: " + wednesday.getCode());
} catch (IllegalArgumentException e) {
System.out.println("Invalid day name provided.");
}
// ✅ 3. 使用 name() 获取枚举名称
Day monday = Day.MONDAY;
System.out.println("Monday's name is: " + monday.name());
// ✅ 4. 使用 ordinal() 获取枚举常量的索引位置
System.out.println("MONDAY's ordinal: " + monday.ordinal());
// ✅ 5. 使用 compareTo(Enum other) 比较两个枚举常量
Day tuesday = Day.TUESDAY;
System.out.println("MONDAY vs TUESDAY: " + monday.compareTo(tuesday));
System.out.println("TUESDAY vs MONDAY: " + tuesday.compareTo(monday));
System.out.println("MONDAY vs MONDAY: " + monday.compareTo(monday));
Day friday= Day.FRIDAY;
System.out.println("MONDAY vs FRIDAY: " + monday.compareTo(friday));
}
}
结束语
Java枚举通过类型安全、代码复用和内置方法,为固定值集合的管理提供了优雅的解决方案。无论是简单的状态表示,还是复杂的业务逻辑,枚举都能显著提升代码的可读性和健壮性。如果你对Java进阶技巧感兴趣,欢迎关注公众号【技海拾贝】,获取更多技术干货与实战案例!