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

【Java系列】深入解析枚举类型

序言

即便平凡的日子仿佛毫无波澜,但在某个特定的时刻,执着的努力便会显现出它的价值和意义。

希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言和我交流

问题

思考一下这寄个问题,我们将围绕这三个问题来开始学习:

  • 什么是枚举
  • 怎么定义枚举
  • 枚举的使用场景

1 什么是枚举  

Java 枚举(Enum)是一种特殊的数据类型,它是一组预定义的常量,每个常量都有一个名称和一个值。

枚举类型在 Java 中被广泛使用,它可以用来代替常量、标志位、状态码等,使代码更加清晰、易读和易维护。

下面是 Java 枚举的详细介绍。

2 枚举的使用

定义枚举类型

在 Java 中,可以通过关键字 enum 来定义枚举类型。枚举类型的定义格式如下:

enum EnumName {Constant1,Constant2,Constant3,...
}

其中 EnumName 是枚举类型的名称,Constant1Constant2Constant3 等是枚举类型的常量。每个枚举常量都有一个名称和一个值,枚举常量的名称通常采用大写字母命名,多个单词之间用下划线分隔。

访问枚举常量

在 Java 中,可以通过枚举类型的名称来访问枚举常量。例如,假设有一个名为 Weekday 的枚举类型,可以通过如下方式来访问枚举常量:

Weekday monday = Weekday.Monday;

这里的 Weekday.Monday 表示 Weekday 枚举类型中的 Monday 常量。

枚举方法

枚举类型可以定义方法,这些方法可以在枚举常量上调用。例如,可以在 Weekday 枚举类型中定义一个 isWeekend 方法来判断当前枚举常量是否为周末:

enum Weekday {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday;public boolean isWeekend() {return this == Saturday || this == Sunday;}
}

在上面的例子中,通过在枚举常量后面定义方法,可以在每个枚举常量上调用这个方法。例如,可以通过 Weekday.Saturday.isWeekend() 来判断 Saturday 是否为周末。

枚举构造器

枚举类型也可以定义构造器,这些构造器只能在枚举常量的定义中被调用,并且只能用来初始化枚举常量的值。例如,可以在 Weekday 枚举类型中定义一个带参数的构造器来设置枚举常量的值:

enum Weekday {Monday("星期一"), Tuesday("星期二"), Wednesday("星期三"), Thursday("星期四"), Friday("星期五"), Saturday("星期六"), Sunday("星期日");private String value;private Weekday(String value) {this.value = value;}public String getValue() {return value;}
}

在上面的例子中,通过在枚举常量后面定义构造器,可以在枚举常量的定义中为枚举常量设置值。例如,可以通过 Weekday.Monday.getValue() 来获取 Monday 的值。

枚举实现接口

枚举类型也可以实现接口,这样每个枚举常量都会自动实现接口中的方法。例如,可以在 Weekday 枚举类型中定义一个接口,并让枚举类型实现这个接口:

interface Printable {void print();
}enum Weekday implements Printable {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday;@Overridepublic void print() {System.out.println("Today is " + this.name());}
}

在上面的例子中,通过让 Weekday 枚举类型实现 Printable 接口,使得每个枚举常量都自动实现了 print 方法。例如,可以通过 Weekday.Monday.print() 来输出当前是星期几。

总结

总之,Java 枚举是一种强类型的数据类型,它提供了一种更加优雅、清晰和类型安全的方式来表示常量、状态码等。

枚举类型可以定义常量、方法、构造器和实现接口,这使得枚举类型非常灵活和功能强大。枚举类型在 Java 中的使用非常广泛,尤其在表示状态、选项等方面,可以极大地提高代码的可读性和易维护性。

2 案例

假设我们有一个游戏,游戏中有三个角色:战士、法师和牧师。每个角色都有自己的属性:血量、攻击力和防御力。

我们可以使用枚举类型来表示这三个角色,代码如下:

定义角色枚举 

public enum Role {WARRIOR("战士", 100, 50, 30),MAGE("法师", 80, 70, 20),PRIEST("牧师", 60, 30, 50);private String name; // 角色名称private int hp; // 角色血量private int attack; // 角色攻击力private int defense; // 角色防御力// 构造方法private Role(String name, int hp, int attack, int defense) {this.name = name;this.hp = hp;this.attack = attack;this.defense = defense;}// getter方法public String getName() {return name;}public int getHp() {return hp;}public int getAttack() {return attack;}public int getDefense() {return defense;}
}

在上面的代码中,我们定义了一个名为Role的枚举类型,其中包含了三个枚举常量:WARRIOR、MAGE和PRIEST。每个枚举常量都有自己的属性:名称、血量、攻击力和防御力。我们还定义了一个构造方法,用于初始化这些属性。最后,我们为每个属性定义了getter方法,以便其他类可以访问这些属性。

 定义角色

现在,我们可以在其他类中使用Role枚举类型来表示游戏中的角色。例如,我们可以编写一个Player类来表示游戏中的玩家,代码如下:

public class Player {private Role role; // 玩家角色public Player(Role role) {this.role = role;}public void attack(Player target) {int damage = this.role.getAttack() - target.getRole().getDefense();if (damage > 0) {int newHp = target.getRole().getHp() - damage;target.getRole().setHp(newHp);}}public Role getRole() {return role;}public void setRole(Role role) {this.role = role;}
}

在上面的代码中,我们定义了一个名为Player的类,用来表示游戏中的玩家。每个玩家都有一个角色,我们使用Role类型的role字段来表示。在Player类的构造方法中,我们需要传入一个Role类型的参数来初始化玩家的角色。

Player类还有一个attack方法,用来实现玩家的攻击操作。在这个方法中,我们通过调用getAttack和getDefense方法来获取玩家的攻击力和防御力,然后计算出攻击造成的伤害。如果伤害值大于0,就更新目标玩家的血量。Player类还有一些getter和setter方法,用来访问和修改玩家的角色。

测试

现在,我们可以编写一个简单的测试类来测试上面的代码,代码如下:

public class GameTest {public static void main(String[] args) {Player player1 = new Player(Role.WARRIOR);Player player2 = new Player(Role.MAGE);System.out.println("玩家1选择了" + player1.getRole().getName());System.out.println("玩家2选择了" + player2.getRole().getName());player1.attack(player2);System.out.println("玩家2的血量为:" + player2.getRole().getHp());}
}

在上面的代码中,我们创建了两个玩家,一个选择了战士角色,另一个选择了法师角色。然后,我们让玩家1攻击玩家2,并输出玩家2的血量。运行这个测试类,输出结果如下:

玩家1选择了战士
玩家2选择了法师
玩家2的血量为:60

从输出结果可以看出,玩家1的攻击对玩家2造成了伤害,玩家2的血量减少了攻击力减去防御力得到的伤害值,变成了60。

总结 

总的来说,这个案例中使用了枚举类型来表示游戏中的角色,每个角色都有自己的属性,并且可以在其他类中使用枚举类型来表示角色。通过这个案例,我们可以看到Java中枚举类型的使用非常灵活,可以用来表示任何有限的常量集合。

图书推荐

Java28岁了,当打之年,并且还会打很多年。

为即将或正在使用Java的你推荐Java“此生错过必遗憾”系列书单。看看你还缺哪本?请补齐。

图书列表:

  • Java核心技术第12版开发基础+高级特性(套装共2册)
  • Java核心技术第11基础知识+高级特性(套装共2册)
  • Java编程思想[Thinking in Java]
  • Effective Java 中文版(原书第3版)
  • Java语言程序设计基础篇+进阶篇(原书第12版)(套装共2册)
  • Java并发编程实战
  • 软件架构实践(原书第4版)

Java核心技术第12版开发基础+高级特性(套装共2册)

Java四大名著之一Core Java最新版,一键打包全套2册!建议入门小白和准备升级到Java17的开发者购买。本书根据Java17新特性全面升级!赠送作者亲授视频课+海量代码集。

可先睹为快:《Java核心技术第12版开发基础+高级特性(套装共2册)》

 Java核心技术第11基础知识+高级特性(套装共2册)

“Java四大名著”之一Core Java次新版,一键打包全套2册!建议实际生产环境仍在使用Java8、Java11开发且暂时没有升级版本打算的开发者购买。本书基于Java9-11编写,赠送作者亲授视频课+海量代码集。

先睹为快:《Java核心技术 卷1 基础知识+Java核心技术 卷2 高级特性(原书第11版)

Java编程思想[Thinking in Java]

“Java四大名著”之一需要有一定编程基础的人才可阅读,即使很多内容还无法理解,但每次读完一定会有所收获。本书单最前面推荐的《Java核心技术》侧重技术,而《Java编程思想》侧重于“思想”,本书为你剖析Java中各个内容的设计理念。这是一本伴随我们技术成长的好书,买一本放在旁边,摸着就有底气。

限时秒杀链接:《Java编程思想(第4版)》

 

Effective Java 中文版(原书第3版)

Java之父James Gosling

“我很希望我10年前就能拥有这本书。有人可能认为我不需要任何Java方面的书籍,但是我需要这本书。”

“Java四大名著”之一适合已经掌握Java核心技术的程序员,想更加深入地了解Java编程语言的开发者阅读。针对如何编写高效、设计优良的程序提出了最实用、最权威的指导方针,通过90条简短、独立的经验法则,探索新的设计模式和语言习惯用法,帮你更加有效地使用Java编程语言及其基本类库,指引你少走弯路。这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。是Java开发人员案头上的一本不可或缺的参考书。

限时秒杀链接:《Effective Java中文版(原书第3版)》

 

Java语言程序设计基础篇+进阶篇(原书第12版)(套装共2册)

书相较于《Java核心技术》更加的基础,如果你阅读《Java核心技术》有些吃力,建议从本书读起。畅销20余年的“长城书”一键打包全套!被世界各地的大学选作教材,更新至Java9、10和11。本书通过示例讲解问题求解技巧,提供大量的程序清单,每章配有丰富的复习题和编程练习题,帮助读者掌握编程技术并解决实际开发中遇到的问题。

限时秒杀链接:《Java语言程序设计基础篇+进阶篇(原书第12版)(套装共2册)》

Java并发编程实战

让注重实战的你更快领悟Java并发编程的要领,快速构建大规模并发应用程序。“Java四大名著”之一《Effective Java》的作者Joshua Bloch参与编写。本书是Java并发编程领域的里程碑著作!从并发编程的基本理论入手,逐步介绍了在设计Java并发程序时各种重要的设计原则、设计模式与思维模式。另一本蚂蚁金服方腾飞老师写的《Java并发编程的艺术》也适合一并阅读。

限时秒杀链接:《Java并发编程实战》

 

软件架构实践(原书第4版)

让你少走弯路的进阶架构师避坑指南!图书届奥斯卡Jolt大奖双冠王作品!全球10余个国家出版。卡内基梅隆等名校教材,IEEE杂志10佳图书,软件架构图书事实标准。

限时秒杀链接:《软件架构实践(原书第4版)》

参与方式

图书数量:本次送出 5 本   !!!⭐️⭐️⭐️
活动时间:截止到 2023-05-29 12:00:00

抽奖方式:

  • 3本,留言+该留言论赞数的前三名各获得一本!
  • 2本,评论区随机挑选小伙伴!
  • 留言内容:“祝Java28岁生日快乐!。+【你想要的书名】”


参与方式:关注博主、点赞、收藏,评论区留言 

中奖名单 

🍓🍓 获奖名单🍓🍓

 中奖名单:请关注博主动态

名单公布时间:2023-05-29 下午

相关文章:

【Java系列】深入解析枚举类型

序言 即便平凡的日子仿佛毫无波澜,但在某个特定的时刻,执着的努力便会显现出它的价值和意义。 希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言和我交流 问题 思考一下这寄个问题&a…...

网络原理(五):IP 协议

目录 认识IP 地址 子网掩码 作用 动态分配IP 地址 NAT 机制 认识MAC地址 MAC地址如何工作 网络设备和相关技术 集线器:转发所有端口 交换机:MAC地址转换表转发 主机&路由器:ARP缓存表ARP寻址 路由器:路由NAPT 数…...

MySQL---空间索引、验证索引、索引特点、索引原理

1. 空间索引 MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型 空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是: 类型 含义 说明 Geometry 空间数据 任何一种空间类型 Poi…...

选择合适的 MQTT 云服务:一文了解 EMQX Cloud Serverless、Dedicated 与 BYOC 版本

引言 EMQX Cloud 是基于 EMQX Enterprise 构建的一款全托管云原生 MQTT 消息服务。为了满足不同客户的需求,EMQX Cloud 提供了三种版本供客户选择:Serverless 版、专有版和 BYOC 版。 本文将简要介绍这三个版本的核心区别,并通过三个用户故…...

uvc驱动ioctl分析下

uvc驱动ioctl分析下 文章目录 uvc驱动ioctl分析下uvc_ioctl_enum_input枚举输入uvc_query_ctrl__uvc_query_ctrluvc_ioctl_g_input 获取输入uvc_ioctl_s_input 设置输入uvc_query_v4l2_ctrluvc_ioctl_queryctrl查询控制器uvc_ioctl_query_ext_ctrl查询扩展控制器 uvc_ioctl_g_c…...

数据库可视化神器,你在用哪一款呢

唠嗑部分 在我们日常开发中,作为开发者,与数据库是肯定要打交道的,比如MySQL,Oracle、sqlserver… 那么数据库可视化工具,你用什么呢?小白今天将常用地几款工具列一下,各位小伙伴如有喜欢的自…...

CMD与DOS脚本编程【第三章】

预计更新 第一章. 简介和基础命令 1.1 介绍cmd/dos脚本语言的概念和基本语法 1.2 讲解常用的基础命令和参数,如echo、dir、cd等 第二章. 变量和运算符 2.1 讲解变量和常量的定义和使用方法 2.2 介绍不同类型的运算符和运算规则 第三章. 控制流程和条件语句 3.1 介…...

多激光雷达手眼标定

手眼标定方法已经有很多博客进行解析,但是都是针对机器人的手(夹爪)眼睛(相机)进行标定。例如: 标定学习笔记(四)-- 手眼标定详解 手眼标定_全面细致的推导过程 本文主要描述多激光…...

SQL执行过程

1. select 语句执行过程 一条 select 语句的执行过程如上图所示 1、建立连接 连接器会校验你输入的用户名和密码是否正确,如果错误会返回提示,如果正确,连接器会查询当前用户对于的权限。连接器的作用就是校验用户权限 2、查询缓存 MySQL…...

K8S 部署 seata

文章目录 创建 Deployment 文件创建 ConfigMap 文件创建 Service 文件运行访问高可用部署踩坑 官方文档 k8s中volumeMounts.subPath的巧妙用法 创建 Deployment 文件 deploymemt.yaml namespace:指定命名空间image:使用 1.5.2 版本的镜像ports&#xf…...

ClickHouse:(二)数据类型

1.整型 固定长度的整型分为:有符号和无符合整型 有符号整型无符号整型类型范围类型范围Int8 -128 : 127 UInt8 0 : 255 Int16 -32768 : 32767 UInt16 0 : 65535 Int32 -2147483648 : 2147483647 UInt32 0 : 4294967295 Int64 -9223372036854775808 : 9223372036854…...

项目文档(request页面代码逻辑)

项目文档 目录 项目文档 1. 封装请求基地址 代码 2. 添加请求拦截器并设置请求头 作用 代码部分 3. 添加响应拦截器 作用 代码 4. token过期问题处理 5. 无感刷新 作用 代码 6. refresh_token过期处理 解决方式 1. 封装请求基地址 在src目录下 放上一个专门写…...

后端传到前端的JSON数据大写变小写--2023

问题复现:1. 首先我先说一下,我用了lombok,事实证明和这个也有关系 前端这里写的也是按照驼峰命名来写的 控制台打印出来的数据 后台打印出来的数据 解决方法: 1. 重写get/set方法 因为我在实体类上标注了Data注解 重写get/se…...

学习【菜鸟教程】【C++ 类 对象】【C++ 类的静态成员】

链接 1. 教程 可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时…...

计算机四大件笔记

啊~数据库、操作系统、计算机网络、Linux start 操作系统 并发和并行 并发是同一时间段内发生了多个事情,多任务之间互相抢占资源。 并行是在同一时间点内发生了多个事情,多任务之间不互相抢占资源,只有多CPU的情况下才能并行。 例如&a…...

【vue上传文件——hash】

vue上传文件 要求:只能上传视频,先计算文件的hash值,hash值一样则不需要上传,不一样在执行上传 分析:因为el-upload没有找到合适的属性,本次用的是原生的input的type属性为file上传 代码: html: 通过点击选取文件按钮调用input上传 js 第一步:点击上传文件先效验是否…...

【OpenCV DNN】Flask 视频监控目标检测教程 01

欢迎关注『OpenCV DNN Youcans』系列,持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 01 【OpenCV DNN】Flask 视频监控目标检测教程 01 1. 面向Python程序的Web框架2. Flask 框架的安装与使用2.1 Flask 安装2.2 Flask 框架例程2.3 绑定IP和端口2.4 Flask路…...

(转载)从0开始学matlab(第10天)—自顶向下的编程思想

在前面的内容中,我们开发了几个完全运转的 MATLAB 程序。但是这些程序都十分简单,包括一系列的 MATLAB 语句,这些语句按照固定的顺序一个接一个的执行。像这样的程序我们称之顺序结构程序。它首先读取输入,然后运算得到所需结果&a…...

mapreduce技术

要实现操作hbase数据表首先要了解它的原理: 1,Hbase原理篇 HBASE就是基于Hadoop的一个开源项目,也是对Google的BigTable的一种实现。 BigTable最浅显来看就是一张很大的表,表的属性可以根据需求去动态增加,但是又没有表与表之间…...

AI智慧安监视频平台EasyCVR视频出现不能播放的情况排查与解决

EasyCVR基于云边端协同,可支持海量视频的轻量化接入与汇聚管理。平台兼容性强、拓展度高,可提供视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码、平台级联等功能。 有用户反…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...