当前位置: 首页 > news >正文

详细讲解一下Java中的Enum

Java 中的 枚举(Enum) 是一种特殊的类,用于表示一组固定且有限的常量(如状态、类型、选项等)。它提供类型安全的常量定义,比传统的常量(如 public static final)更强大和灵活。以下是 Java 枚举的详细讲解:


一、枚举的基本语法

public enum Season {SPRING, SUMMER, AUTUMN, WINTER; // 常量必须放在最前面
}
底层实现:
  • 枚举本质是继承自 java.lang.Enum 的类,每个枚举常量都是该类的实例(单例)。
  • 编译器会自动生成 values()valueOf(String) 方法。

二、枚举的核心特性

1. 类型安全
  • 枚举常量是类型明确的,不能随意赋值其他类型。
Season currentSeason = Season.SPRING; // 只能赋值 Season 的常量
2. 固定常量集合
  • 枚举的常量在定义时确定,无法运行时动态修改。
3. 可附加属性和方法
  • 枚举可以定义字段、构造函数和方法,实现更复杂的逻辑:
public enum Planet {MERCURY(3.303e+23, 2.4397e6),VENUS(4.869e+24, 6.0518e6);private final double mass;   // 属性private final double radius; Planet(double mass, double radius) { // 构造函数(默认 private)this.mass = mass;this.radius = radius;}public double surfaceGravity() { // 方法return mass / (radius * radius);}
}
4. 可实现接口
  • 枚举可以实现接口,但无法继承其他类(因为已经隐式继承 Enum)。
public interface Printable {void print();
}public enum Color implements Printable {RED {public void print() { System.out.println("红色"); }},GREEN {public void print() { System.out.println("绿色"); }};
}

三、枚举的常用方法

1. 内置方法
  • values():返回枚举所有常量的数组。
  • valueOf(String name):根据名称返回对应的枚举常量。
  • name():返回枚举常量的名称(字符串形式)。
  • ordinal():返回枚举常量的声明顺序(从 0 开始)。
2. 示例代码
Season[] seasons = Season.values(); // 获取所有枚举值
Season s = Season.valueOf("SPRING"); // 根据名称获取枚举
System.out.println(s.name());        // 输出 "SPRING"
System.out.println(s.ordinal());     // 输出 0

四、枚举的高级用法

1. 枚举与单例模式
  • 枚举是实现线程安全单例的最佳方式(防止反射攻击和序列化问题):
public enum Singleton {INSTANCE;public void doSomething() {// 业务逻辑}
}
2. 枚举作为状态机
  • 通过枚举的属性和方法,可以优雅地实现状态流转:
public enum OrderStatus {NEW {public OrderStatus next() { return PAID; }},PAID {public OrderStatus next() { return SHIPPED; }},SHIPPED {public OrderStatus next() { return COMPLETED; }},COMPLETED {public OrderStatus next() { return this; }};public abstract OrderStatus next();
}
3. 策略模式
  • 通过枚举实现不同的策略行为:
public enum Operation {ADD { public int apply(int a, int b) { return a + b; } },SUB { public int apply(int a, int b) { return a - b; } };public abstract int apply(int a, int b);
}

五、枚举的注意事项

  1. 构造函数私有化
    枚举的构造函数默认是 private,不能手动修改为 publicprotected

  2. 常量定义位置
    枚举常量必须定义在类的第一行,之后才能定义字段和方法。

  3. 性能与内存
    枚举比常量占用更多内存(每个常量是一个对象实例),但在大多数场景下影响可忽略。

  4. 序列化
    枚举的序列化仅存储名称,反序列化时通过 valueOf 恢复,天然安全。


六、枚举 vs 常量类

特性枚举常量类(public static final)
类型安全✔️ 编译时检查类型❌ 只是 int/String 常量
可附加方法✔️ 支持方法和属性❌ 只能定义简单值
扩展性❌ 常量固定✔️ 可随意添加新常量(但破坏封装)
线程安全✔️ 实例天然单例且不可变❌ 需手动控制

七、总结

使用枚举的场景

  • 需要一组固定的、类型安全的常量(如状态、错误码、配置选项)。
  • 需要为常量附加行为或数据(如计算、状态流转)。
  • 实现单例或策略模式。

避免枚举的场景

  • 需要动态生成常量(如从数据库加载)。
  • 对内存极度敏感(如嵌入式开发)。

枚举是 Java 中一种强大的工具,合理使用可以大幅提升代码的可读性和健壮性。
在这里插入图片描述

http://www.xdnf.cn/news/3151.html

相关文章:

  • Missashe考研日记-day22
  • AI与物联网的深度融合:开启智能生活新时代
  • 写书的三驾马车
  • 【Unity】UI点击事件处理器
  • 文件系统 软硬连接
  • 类和对象(下篇)(详解)
  • 2025.4.20机器学习笔记:文献阅读
  • 【前端】跟着maxkb学习流程图画法
  • Qt QML实现Windows桌面歌词动态播放效果
  • Win10如何一键切换IP地址教程
  • ubtuntu安装docker拉取iwebsec镜像
  • 关于STM32G030和G070未初始化看门狗,程序里面喂狗会导致擦除Flash失败或进入‘HardFault_Handler’
  • WebSocket 实现数据实时推送原理
  • GPT,Bert类模型对比
  • 4.17---实现商铺和缓存与数据库双写一致以及宕机处理
  • 2025.04.17【Dendrogram】生信数据可视化:Dendrogram图表详解
  • 网络编程 - 1
  • Genspark:重新定义AI搜索与代理的全能型工具
  • 私人笔记:动手学大模型应用开发llm-universe项目环境创建
  • 【前端vue生成二维码和条形码——MQ】
  • 【随身WIFI】随身WiFi Debian系统优化教程
  • AUTOSAR图解==>AUTOSAR_SWS_DefaultErrorTracer
  • 计算机网络 - UDP协议
  • 4.15BUUCTF Ez_bypass,HardSQL,AreUSerialz,BabyUpload,CheckIn
  • 【Docker】运行错误提示 unknown shorthand flag: ‘d‘ in -d ----详细解决方法
  • jQuery入门和选择器
  • JavaScript-立即执行函数(Immediately Invoked Function Expression,IIFE)
  • 【AI量化第24篇】KhQuant 策略框架深度解析:让策略开发回归本质——基于miniQMT的量化交易回测系统开发实记
  • dumpsys--音频服务状态信息
  • ASP.NET Core Web API 配置系统集成