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

相关推荐
m0_480502647 分钟前
Rust 入门 泛型和特征-特征对象 (十四)
开发语言·后端·rust
程序员爱钓鱼35 分钟前
Go语言实战案例-使用ORM框架 GORM 入门
后端
M1A136 分钟前
TCP协议详解:为什么它是互联网的基石?
后端·网络协议·tcp/ip
一枚小小程序员哈1 小时前
基于微信小程序的家教服务平台的设计与实现/基于asp.net/c#的家教服务平台/基于asp.net/c#的家教管理系统
后端·c#·asp.net
楽码1 小时前
自动修复GoVet:语言实现对比
后端·算法·编程语言
石榴树下1 小时前
00. 马里奥的 OAuth 2 和 OIDC 历险记
后端
uhakadotcom1 小时前
开源:subdomainpy快速高效的 Python 子域名检测工具
前端·后端·面试
似水流年流不尽思念2 小时前
容器化技术了解吗?主要解决什么问题?原理是什么?
后端
Java水解2 小时前
Java中的四种引用类型详解:强引用、软引用、弱引用和虚引用
java·后端
i听风逝夜2 小时前
看好了,第二遍,SpringBoot单体应用真正的零停机无缝更新代码
后端