Java 枚举(Enum)的使用说明

在 Java 中,枚举(Enum)是一种特殊的数据类型,用于定义一组固定的命名常量。它比传统的常量(如 public static final)更安全、更灵活,且支持面向对象特性。以下是枚举的详细用法:


1. 基础定义与使用

java

复制

下载

public enum Direction {NORTH, SOUTH, EAST, WEST  // 枚举常量(全大写命名)
}// 使用示例
Direction dir = Direction.NORTH;
System.out.println(dir); // 输出: NORTH

2. 添加成员变量和方法

枚举可以有字段、构造方法和自定义方法:

java

复制

下载

public enum Planet {// 枚举常量 + 构造参数MERCURY(3.303e23, 2.4397e6),VENUS(4.869e24, 6.0518e6);private final double mass;   // 质量(kg)private final double radius; // 半径(m)// 构造方法(必须是 private)Planet(double mass, double radius) {this.mass = mass;this.radius = radius;}// 自定义方法public double surfaceGravity() {return 6.67430e-11 * mass / (radius * radius);}
}// 使用
double gravity = Planet.MERCURY.surfaceGravity();

3. 覆盖枚举常量的方法

每个常量可以有自己的方法实现:

java

复制

下载

public enum Operation {ADD {public double apply(double x, double y) { return x + y; }},SUBTRACT {public double apply(double x, double y) { return x - y; }};public abstract double apply(double x, double y); // 抽象方法
}// 使用
double result = Operation.ADD.apply(5, 3); // 返回 8

4. 常用内置方法

  • values():获取所有枚举值

  • valueOf(String name):通过名称获取枚举常量

  • name() 和 ordinal():获取常量名和顺序位置

java

复制

下载

Direction[] allDirections = Direction.values(); // [NORTH, SOUTH, EAST, WEST]
Direction east = Direction.valueOf("EAST");    // 字符串转枚举
System.out.println(east.name());     // 输出 "EAST"
System.out.println(east.ordinal());  // 输出 2(索引从0开始)

5. 实现接口

枚举可以实现接口,统一或分别实现方法:

java

复制

下载

public interface Command {void execute();
}public enum FileOperation implements Command {OPEN {public void execute() { System.out.println("打开文件"); }},SAVE {public void execute() { System.out.println("保存文件"); }};
}// 使用
FileOperation.OPEN.execute(); // 输出 "打开文件"

6. 在 switch 语句中使用

java

复制

下载

Direction dir = Direction.NORTH;
switch (dir) {case NORTH:System.out.println("向北");break;case SOUTH:System.out.println("向南");break;// ...其他 case
}

7. 单例模式(线程安全)

枚举是实现单例的最佳方式(避免反射攻击):

java

复制

下载

public enum Singleton {INSTANCE;public void doSomething() {System.out.println("单例操作");}
}// 使用
Singleton.INSTANCE.doSomething();

关键特性总结

特性说明
类型安全编译时检查,避免传入无效值
固定实例枚举常量在 JVM 中是唯一的(== 比较安全)
支持 OOP可包含字段、方法、构造方法,实现接口,覆盖方法
线程安全枚举实例的创建由 JVM 保证,天然适合单例
序列化安全无需额外处理,Java 原生支持枚举的序列化与反序列化

何时使用枚举?

  • 需要一组预定义的常量(如状态、类型、方向等)

  • 需要类型安全且易读的常量

  • 需要为常量附加行为(方法)

  • 实现单例模式

通过合理使用枚举,可以大幅提升代码的可读性、安全性和可维护性。

Java 枚举类型完整示例

下面是一个完整的Java枚举使用示例,展示了枚举的各种特性:

import java.time.DayOfWeek;public class EnumExample {// 1. 基本枚举定义public enum Season {SPRING, SUMMER, AUTUMN, WINTER}// 2. 带属性和方法的枚举public enum Planet {MERCURY(3.303e23, 2.4397e6),VENUS(4.869e24, 6.0518e6),EARTH(5.976e24, 6.37814e6),MARS(6.421e23, 3.3972e6),JUPITER(1.9e27, 7.1492e7),SATURN(5.688e26, 6.0268e7),URANUS(8.686e25, 2.5559e7),NEPTUNE(1.024e26, 2.4746e7);private final double mass;   // 千克private final double radius; // 米// 私有构造函数Planet(double mass, double radius) {this.mass = mass;this.radius = radius;}public double getMass() {return mass;}public double getRadius() {return radius;}// 计算表面重力public double surfaceGravity() {final double G = 6.67430e-11; // 引力常数return G * mass / (radius * radius);}// 计算重量public double surfaceWeight(double otherMass) {return otherMass * surfaceGravity();}}// 3. 带抽象方法的枚举public enum Operation {ADD("+") {public double apply(double x, double y) {return x + y;}},SUBTRACT("-") {public double apply(double x, double y) {return x - y;}},MULTIPLY("*") {public double apply(double x, double y) {return x * y;}},DIVIDE("/") {public double apply(double x, double y) {if (y == 0) throw new ArithmeticException("Division by zero");return x / y;}};private final String symbol;Operation(String symbol) {this.symbol = symbol;}public String getSymbol() {return symbol;}// 抽象方法 - 每个枚举常量必须实现public abstract double apply(double x, double y);}// 4. 枚举实现接口public interface WorkSchedule {String getSchedule();}public enum WorkDay implements WorkSchedule {MONDAY("09:00-17:00") {public String getMotivation() {return "New week, new opportunities!";}},TUESDAY("09:00-17:00") {public String getMotivation() {return "Keep the momentum going!";}},WEDNESDAY("09:00-17:00") {public String getMotivation() {return "Halfway there!";}},THURSDAY("09:00-17:00") {public String getMotivation() {return "Almost there!";}},FRIDAY("09:00-16:00") {public String getMotivation() {return "Weekend is near!";}},SATURDAY("Day Off") {public String getMotivation() {return "Enjoy your weekend!";}},SUNDAY("Day Off") {public String getMotivation() {return "Rest and recharge!";}};private final String schedule;WorkDay(String schedule) {this.schedule = schedule;}@Overridepublic String getSchedule() {return schedule;}// 每个枚举常量可以有自己的方法实现public abstract String getMotivation();}public static void main(String[] args) {// 1. 基本枚举使用System.out.println("===== 基本枚举使用 =====");Season currentSeason = Season.SUMMER;System.out.println("当前季节: " + currentSeason);System.out.println("所有季节:");for (Season season : Season.values()) {System.out.println(season);}System.out.println();// 2. 带属性和方法的枚举System.out.println("===== 行星信息 =====");double earthWeight = 70; // 千克Planet earth = Planet.EARTH;System.out.printf("地球表面重力: %.2f m/s²%n", earth.surfaceGravity());System.out.printf("地球上 %.1f kg 的重量相当于: %n", earthWeight);for (Planet p : Planet.values()) {System.out.printf("在 %-8s上的重量: %6.1f kg%n", p, p.surfaceWeight(earthWeight));}System.out.println();// 3. 带抽象方法的枚举System.out.println("===== 数学运算 =====");double x = 10, y = 4;for (Operation op : Operation.values()) {System.out.printf("%.1f %s %.1f = %.1f%n", x, op.getSymbol(), y, op.apply(x, y));}System.out.println();// 4. 枚举实现接口System.out.println("===== 工作日安排 =====");DayOfWeek today = java.time.LocalDate.now().getDayOfWeek();WorkDay currentDay = WorkDay.valueOf(today.toString());System.out.println("今天是: " + currentDay);System.out.println("工作时间: " + currentDay.getSchedule());System.out.println("每日激励: " + currentDay.getMotivation());System.out.println();// 5. 在switch语句中使用枚举System.out.println("===== 根据季节推荐活动 =====");switch (currentSeason) {case SPRING:System.out.println("春天活动: 赏花、踏青");break;case SUMMER:System.out.println("夏天活动: 游泳、露营");break;case AUTUMN:System.out.println("秋天活动: 采摘、登山");break;case WINTER:System.out.println("冬天活动: 滑雪、泡温泉");break;}System.out.println();// 6. 单例模式System.out.println("===== 单例模式 =====");AppConfig config = AppConfig.INSTANCE;config.setAppName("Enum Demo App");System.out.println("应用名称: " + config.getAppName());System.out.println("配置ID: " + config.getConfigId());}// 7. 使用枚举实现单例模式public enum AppConfig {INSTANCE;private String appName;private final String configId = "CONFIG-" + System.currentTimeMillis();public String getAppName() {return appName;}public void setAppName(String appName) {this.appName = appName;}public String getConfigId() {return configId;}}
}

示例说明

1. 基本枚举 (Season)

  • 最简单的枚举形式,只有一组命名常量

  • 使用 values() 方法遍历所有枚举值

  • 直接打印枚举常量会输出其名称

2. 带属性和方法的枚举 (Planet)

  • 每个行星有质量和半径属性

  • 提供计算表面重力和重量的方法

  • 展示了如何使用枚举的构造函数初始化属性

3. 带抽象方法的枚举 (Operation)

  • 定义抽象方法 apply(),每个枚举常量必须实现

  • 每个运算有自己的符号表示

  • 演示了如何为不同枚举常量提供不同行为

4. 实现接口的枚举 (WorkDay)

  • 实现 WorkSchedule 接口

  • 每个工作日有自己的时间安排

  • 每个枚举常量有自己的激励语实现

  • 结合Java 8的日期API获取当前星期几

5. switch语句中使用枚举

  • 根据当前季节推荐不同的活动

  • 展示了枚举在switch语句中的类型安全特性

6. 单例模式实现 (AppConfig)

  • 使用枚举实现线程安全的单例

  • 包含配置属性和访问方法

  • 展示了枚举如何防止反射攻击和序列化问题

运行结果

运行此程序将输出类似以下内容(具体结果取决于运行时的日期):

text

复制

下载

===== 基本枚举使用 =====
当前季节: SUMMER
所有季节:
SPRING
SUMMER
AUTUMN
WINTER===== 行星信息 =====
地球表面重力: 9.80 m/s²
地球上 70.0 kg 的重量相当于: 
在 MERCURY 上的重量:   26.4 kg
在 VENUS   上的重量:   63.1 kg
在 EARTH   上的重量:   70.0 kg
在 MARS    上的重量:   26.5 kg
在 JUPITER 上的重量:  177.0 kg
在 SATURN  上的重量:   74.9 kg
在 URANUS  上的重量:   63.5 kg
在 NEPTUNE 上的重量:   79.6 kg===== 数学运算 =====
10.0 + 4.0 = 14.0
10.0 - 4.0 = 6.0
10.0 * 4.0 = 40.0
10.0 / 4.0 = 2.5===== 工作日安排 =====
今天是: WEDNESDAY
工作时间: 09:00-17:00
每日激励: Halfway there!===== 根据季节推荐活动 =====
夏天活动: 游泳、露营===== 单例模式 =====
应用名称: Enum Demo App
配置ID: CONFIG-1717999999999

这个示例全面展示了Java枚举的各种特性,包括基本用法、带属性和方法的枚举、抽象方法实现、接口实现、在switch语句中使用以及实现单例模式。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker部署Nginx-UI

使用如下命令拉取运行nginx-ui软件 docker run -dit \ --namenginx-ui \ --restartalways \ -e TZAsia/Shanghai \ -v /mnt/user/appdata/nginx:/etc/nginx \ -v /mnt/user/appdata/nginx-ui:/etc/nginx-ui \ -v /var/run/docker.sock:/var/run/docker.sock \ -…

OkHttp 3.0源码解析:从设计理念到核心实现

本文通过深入分析OkHttp 3.0源码,揭示其高效HTTP客户端的实现奥秘,包含核心设计理念、关键组件解析、完整工作流程及实用技巧。 一、引言:为什么选择OkHttp? 在Android和Java生态中,OkHttp已成为HTTP客户端的标准选择…

洛谷P12170 [蓝桥杯 2025 省 Python B] 攻击次数

题目传送门 思路 首先定义一个数 n n n ,初值为 2025 2025 2025,从第一回合开始,三个英雄持续攻击,攻击方式为: 第一个英雄: 每回合攻击 5 5 5

百度之星2021——BD202104 萌新

输入格式: 本题有多组测试数据。 第一行一个数 T (1 ≤ T ≤ 1000) 表示一共有 T 组数据。对于每一组数据,输入一行两个数 a,b (1 ≤ a,b ≤ 1000000000)。 输出格式: 对每组数据,输出一行两个数分别表示最小与最大的 c&#xff0…

R语言ICU患者死亡率预测实战

【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) 预测ICU患者死亡率对比较药物的疗效、比较护理的有效性、比较手术的有效性有重要意义,利用机…

leetcode240-搜索二维矩阵

leetcode 240 思路 1. 矩阵特性 首先,利用矩阵的特性是解题的关键: 每行的元素递增每列的元素递增 这意味着,如果我们在矩阵中从右上角或左下角开始搜索,可以有效缩小搜索范围 2. 从右上角开始搜索 将搜索的起点定位在矩阵…

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…

【web应用】若依框架:若依框架中的页面跳转简介

文章目录 ⭐前言1. 后端控制器跳转2. 前端路由跳转3. 菜单配置跳转4. 权限控制跳转5. 常见跳转路径 ⭐一、主目录页面跳转⭐二、菜单目录跳转⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈&#x…

MS9292+MS9332 HD/DVI转VGA转换器+HD环出带音频

MS9292MS9332是一款HD/DVI转VGA转换器HD环出带音频的视频转换方案。支持HD/DVI输入,VGA输出和HD环出,HD/DVI输入最高支持1920120060Hz,VGA输出最高支持1920120060Hz,HD环出最高支持4K30Hz。该方案已实现量产,并提供完善…

C++初阶-list的模拟实现(难度较高)

1.list(容器,不是类)模拟实现基本结构 这个实现是和源码的实现不同的,不要进行强制类型转换了,很麻烦。我们把定义放在.h文件中,在.cpp中放测试代码。 注:这个基本结构之后会改变,…

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…

【iOS】cell的复用以及自定义cell

【iOS】cell的复用以及自定义cell 文章目录 【iOS】cell的复用以及自定义cell前言cell的复用手动(非注册)自动(注册) 自定义cell 前言 cell的复用及自定义cell是UITableView或UICollectionView的一个重要优化机制,当用户滚动视图…

深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(2)

前言 《深度学习之模型压缩三驾马车:基于ResNet18的模型剪枝实战(1)》里面我只是提到了对conv1层进行剪枝,只是为了验证这个剪枝的整个过程,但是后面也有提到:仅裁剪 conv1层的影响极大,原因如…

传输层协议:UDP

目录 1、概念 2、报文结构 3、核心特性 3.1 无连接 3.2 不可靠交付 3.3 面向数据报 3.4 轻量级&高效 3.5 支持广播和组播 4、典型应用场景 5、优缺点分析 6、与TCP的区别 1、概念 UDP(User Datagram Protocol,用户数据报协议&#xff09…

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…

【汇编逆向系列】七、函数调用包含多个参数之浮点型- XMM0-3寄存器

目录 1. 汇编代码 1.1 debug编译 1.2 release编译 2. 汇编分析 2.1 浮点参数传递规则 2.2 栈帧rsp的变化时序 2.3 参数的访问逻辑 2.4 返回值XMM0寄存器 3. 汇编转化 3.1 Debug编译 3.2 Release 编译 3.3 C语言转化 1. 汇编代码 上一节介绍了整型的函数传参&#x…

华为云Flexus+DeepSeek征文 | 从零到一:用Flexus云服务打造低延迟联网搜索Agent

作者简介 我是摘星,一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型,将实际使用经验分享给大家,希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 作者简介 前言 1. 项目背景与技术选型 1.1 项目…

【多智能体】受木偶戏启发实现多智能体协作编排

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本专栏《人工智能》旨在记录最新的科研前沿,包括大模型、具身智能、智能体等相关领域,期待与你一同探索、学习、进步,一起卷起来叭&#xff…

Java八股文——Spring篇

文章目录 Java八股文专栏其它文章Java八股文——Spring篇SpringSpring的IoC和AOPSpring IoC实现机制Spring AOP实现机制 动态代理JDK ProxyCGLIBByteBuddy Spring框架中的单例Bean是线程安全的吗?什么是AOP,你们项目中有没有使用到AOPSpring中的事务是如…