Java Enum 类:优雅的常量定义与管理方式(深度解析)

前言

在软件开发中,我们经常遇到需要定义固定集合的场景,比如星期、月份、状态码等。早期开发者通常使用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 核心特点

  1. 类型安全 枚举变量只能接受定义好的常量,避免无效值的传入。例如:

    ini 复制代码
    public enum Day { 
        MONDAY, TUESDAY 
    }
    Day today = Day.MONDAY; // 合法
    Day invalidDay = "WEDNESDAY"; // 编译错误
  2. 不可变性 枚举实例是public static final​的,一旦定义无法修改。

  3. 继承与限制

    • 所有枚举类默认继承java.lang.Enum不能显式继承其他类
    • 枚举可以实现接口,但无法被其他类继承。
  4. 内置方法 枚举类自动继承以下方法:

    • name(): 返回枚举常量的名称(如Day.MONDAY.name()"MONDAY")。
    • ordinal(): 返回枚举常量的序号(从0开始)。
    • values(): 以数组形式返回所有枚举常量。
    • valueOf(String name): 根据名称获取枚举实例(未找到时抛出异常)。

1.4 应用场景

  1. 状态机管理 表示有限状态集合,如订单状态、设备状态。

    swift 复制代码
    public enum OrderStatus {
        PENDING, PROCESSING, COMPLETED, CANCELED;
    }
  2. 业务配置项 定义固定分类或规则,如用户角色、权限等级。

    arduino 复制代码
    public enum UserRole {
        ADMIN, USER, GUEST;
    }
  3. 数据字典映射 关联代码、描述等信息,用于国际化或数据库字段映射。

    arduino 复制代码
    public 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枚举模式,这样的定义方式并没有什么错,但它存在许多不足:

  1. 如在类型安全和使用方便性上并没有多少好处
  2. 如果存在定义int值相同的变量,混淆的几率还是很大的,编译器也不会提出任何警告
  3. 操作上,比如我要拿到所有的枚举值,或者根据枚举值拿到具体的名字等都非常的不方便 因此这种方式在枚举出现后并不提倡,现在我们利用枚举类型来重新定义上述的常量,同时也感受一把枚举定义的方式,如下定义周一到周日的常量

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进阶技巧感兴趣,欢迎关注公众号【技海拾贝】,获取更多技术干货与实战案例!

相关推荐
努力的小郑6 分钟前
MySQL索引(三):字符串索引优化之前缀索引
后端·mysql·性能优化
IT_陈寒28 分钟前
🔥3分钟掌握JavaScript性能优化:从V8引擎原理到5个实战提速技巧
前端·人工智能·后端
程序员清风1 小时前
贝壳一面:年轻代回收频率太高,如何定位?
java·后端·面试
考虑考虑1 小时前
Java实现字节转bcd编码
java·后端·java ee
AAA修煤气灶刘哥2 小时前
ES 聚合爽到飞起!从分桶到 Java 实操,再也不用翻烂文档
后端·elasticsearch·面试
爱读源码的大都督2 小时前
Java已死?别慌,看我如何用Java手写一个Qwen Code Agent,拯救Java
java·人工智能·后端
星辰大海的精灵2 小时前
SpringBoot与Quartz整合,实现订单自动取消功能
java·后端·算法
天天摸鱼的java工程师3 小时前
RestTemplate 如何优化连接池?—— 八年 Java 开发的踩坑与优化指南
java·后端
一乐小哥3 小时前
一口气同步10年豆瓣记录———豆瓣书影音同步 Notion分享 🚀
后端·python
LSTM973 小时前
如何使用C#实现Excel和CSV互转:基于Spire.XLS for .NET的专业指南
后端