详细讲解一下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.mzph.cn/bicheng/77249.shtml

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

相关文章

首席人工智能官(Chief Artificial Intelligence Officer,CAIO)的详细解析

以下是**首席人工智能官(Chief Artificial Intelligence Officer,CAIO)**的详细解析: 1. 职责与核心职能 制定AI战略 制定公司AI技术的长期战略,明确AI在业务中的应用场景和优先级,推动AI与核心业务的深度…

LeetCode【剑指offer】系列(位运算篇)

剑指offer15.二进制中1的个数 题目链接 题目:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。 思路一&#xff…

前端路由缓存实现

场景:以一体化为例:目前页面涉及页签和大量菜单路由,用户想要实现页面缓存,即列表页、详情页甚至是编辑弹框页都要实现数据缓存。 方案:使用router-view的keep-alive实现 。 一、实现思路 1.需求梳理 需要缓存模块&…

Buildroot编译过程中下载源码失败

RK3588编译编译一下recovery,需要把buildroot源码编译一遍。遇到好几个文件都下载失败,如下所示 pm-utils 1.4.1这个包下载失败,下载地址http://pm-utils.freedesktop.org/releases 解决办法,换个网络用windows浏览器下载后&…

Operator 开发入门系列(一):Hello World

背景 我们公司最近计划将产品迁移到 Kubernetes 环境。 为了更好地管理和自动化我们的应用程序,我们决定使用 Kubernetes Operator。 本系列博客将记录我们学习和开发 Operator 的过程,希望能帮助更多的人入门 Operator 开发。 目标读者 对 Kubernete…

Java基础知识面试题(已整理Java面试宝典pdf版)

什么是Java Java是一门面向对象编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论…

科学视角下的打坐:身心获益的实证探究

在快节奏的现代生活中,人们在追求物质丰富的同时,也愈发关注身心的健康与平衡。古老的打坐修行方式,正逐渐走进科学研究的视野,并以大量实证数据展现出对人体多方面的积极影响。​ 什么是打坐: 打坐是一种养生健身法…

javaSE————网络编程套接字

网络编程套接字~~~~~ 好久没更新啦,蓝桥杯爆掉了,从今天开始爆更嗷; 1,网络编程基础 为啥要有网络编程呢,我们进行网络通信就是为了获取丰富的网络资源,说实话真的很神奇,想想我们躺在床上&a…

MySQL性能调优(三):MySQL中的系统库(mysql系统库)

文章目录 MySQL性能调优数据库设计优化查询优化配置参数调整硬件优化 MySQL中的系统库1.5.Mysql中mysql系统库1.5.1.权限系统表1.5.2.统计信息表1.5.2.1.innodb_table_stats1.5.2.2.innodb_index_stats 1.5.3.日志记录表1.5.3.1. general_log1.5.3.2. slow_log 1.5.4.InnoDB中的…

多个路由器互通(静态路由)无单臂路由(简单版)

多个路由器互通(静态路由)无单臂路由(简单版) 开启端口并配ip地址 维护1 Router>en Router#conf t Router(config)#int g0/0 Router(config-if)#no shutdown Router(config-if)#ip address 192.168.10.254 255.255.255.0 Ro…

关于 AI驱动的智慧家居、智慧城市、智慧交通、智慧医疗和智慧生活 的详细解析,涵盖其定义、核心技术、应用场景、典型案例及未来趋势

以下是关于 AI驱动的智慧家居、智慧城市、智慧交通、智慧医疗和智慧生活 的详细解析,涵盖其定义、核心技术、应用场景、典型案例及未来趋势: 一、AI智慧家居 1. 定义与核心功能 定义:通过AI与物联网(IoT)技术&#…

【ESP32|音频】一文读懂WAV音频文件格式【详解】

简介 最近在学习I2S音频相关内容,无可避免会涉及到关于音频格式的内容,所以刚开始接触的时候有点一头雾水,后面了解了下WAV相关内容,大致能够看懂wav音频格式是怎么样的了。本文主要为后面ESP32 I2S音频系列文章做铺垫&#xff0…

端侧大模型综述On-Device Language Models: A Comprehensive Review

此为机器翻译,仅做个人学习使用 设备端语言模型:全面回顾 DOI:10.48550/arXiv.2409.00088 1 摘要 大型语言模型 (LLM) 的出现彻底改变了自然语言处理应用程序,由于减少延迟、数据本地化和个性化用户体验…

推流265视频,网页如何支持显示265的webrtc

科技发展真快,以前在网页上(一般指谷歌浏览器),要显示265的视频流,都是很鸡肋的办法,要么转码,要么用很慢的hls,体验非常不好,而今谷歌官方最新的浏览器已经支持265的web…

redis的sorted set的应用场景

Redis 的 Sorted Set(有序集合,简称 ZSet) 结合了 Set 的去重特性 和 按分数(score)排序 的特性,非常适合需要 高效排序 或 范围查询 的场景。以下是它的典型应用场景及示例: 实时排行榜 场景&…

18-21源码剖析——Mybatis整体架构设计、核心组件调用关系、源码环境搭建

学习视频资料来源:https://www.bilibili.com/video/BV1R14y1W7yS 文章目录 1. 架构设计2. 核心组件及调用关系3. 源码环境搭建3.1 测试类3.2 实体类3.3 核心配置文件3.4 映射配置文件3.5 遇到的问题 1. 架构设计 Mybatis整体架构分为4层: 接口层&#…

未启用CUDA支持的PyTorch环境** 中使用GPU加速解决方案

1. 错误原因分析 根本问题:当前安装的PyTorch是CPU版本,无法调用GPU硬件加速。当运行以下代码时会报错:model YOLO("yolov8n.pt").to("cuda") # 或 .cuda()2. 解决方案步骤 步骤1:验证CUDA可用性 在Pyth…

JVM-基于Hotspot

前言 Java虚拟机(Java Virtual Machine简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,其主要任务为将字节码装载到内部,解释/编译为对应平台上的机器指令执行。 Java虚拟机规范定义了一个抽象的——…

智能合约安全审计平台——可视化智能合约漏洞扫描

目录 可视化智能合约漏洞扫描 —— 理论、实践与安全保障1. 引言2. 理论背景与漏洞原理2.1 智能合约简介2.2 常见漏洞类型2.3 漏洞扫描与安全评估原理3. 系统架构与工作流程3.1 系统总体架构3.2 模块说明4. 漏洞扫描流程详解4.1 代码上传与静态解析4.2 漏洞模式检测4.3 风险评估…

【MySQL数据库】数据类型详解

目录 数据类型tinyint类型(整形)bit类型小数浮点数 float、doubledecimal 字符串类型charvarcharchar与varchar的比较 日期时间类型enum和set总结 数据类型 tinyint类型(整形) 例: mysql> create table tt1(num tinyint);mysql> insert into tt1 values(1)…