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

news2024/12/27 14:04:25

 

序言

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

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

问题

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

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

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;

    @Override
    public 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

抽奖方式:

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


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

中奖名单 

🍓🍓 获奖名单🍓🍓

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

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

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

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

相关文章

行为型设计模式01-策略模式

✨作者:猫十二懿 ❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github 🎉公众号:猫十二懿 策略模式 问题引入:实现一个商场收银软件,简单的实现就是单价和数量的乘积。 1、商场收银软件 下面就来看…

掌握RDD分区

零、本讲学习目标 学会如何指定分区数量会定义与使用自定义分区器 一、RRD分区 (一)RDD分区概念 RDD是一个大的数据集合,该集合被划分成多个子集合分布到了不同的节点上,而每一个子集合就称为分区(Partition&#…

3.5 RDD持久化机制

一、RDD持久化 1、不采用持久化操作 查看要操作的HDFS文件 以集群模式启动Spark Shell 按照图示进行操作,得RDD4和RDD5 查看RDD4内容,会从RDD1到RDD2到RDD3到RDD4跑一趟 显示RDD5内容,也会从RDD1到RDD2到RDD3到RDD5跑一趟 2、采用持久化…

python解析html数据,获取到的链接是以/或 ./ 或 ../ 开头的相对链接,不是以http开头的,需要补全

一、实现的目标 在使用爬虫获取网页html数据时,解析到的链接是/或./ 开头的相对链接,不是以http开头的链接,如:/picture/0/cca65350643c441e80d390ded3975db0.png 。此时需要完成对该链接的补全,以得到正确的链接。此外,我们需要将解析到的html数据保存到起来,将来需要展…

3.8 Spark RDD典型案例

一、利用RDD计算总分与平均分 (一)准备工作 1、启动HDFS服务 2、启动Spark服务 3、在本地创建成绩文件 4、将成绩文件上传到HDFS (二)完成任务 1、在Spark Shell里完成任务 (1)读取成绩文件&#xff…

【搭建轻量级图床】本地搭建LightPicture开源图床管理系统,并公网远程访问

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进,功能也越来越多,而手机…

二十三种设计模式第九篇--代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 意图:为其他对象提供一种代理以控制对这…

示范性微电子院校“抢人”,芯片赛道黄不了!

经常看到有同学问,“国内高校微电子专业最好的是哪所高校?”“想搞数字ic设计去哪所大学好呢?” 其实国内28所示范性微电子学院都是非常不错的选择。 2015年,九所示范性微电子院校名单公布,包括了清华大学、北京大学、复旦大学…

8、Linux C/C++ 实现MySQL的图片插入以及图片的读取

本文结合了Linux C/C 实现MySQL的图片插入以及图片的读取,特别是数据库读写的具体流程 一、文件读取相关函数 fseek() 可以将文件指针移动到文件中的任意位置。其基本形式如下: int fseek(FILE *stream, long offset, int whence);其中,str…

kafka 设置用户密码和通过SpringBoot测试

叙述 当前Kafka认证方式采用动态增加用户协议。 自0.9.0.0版本开始Kafka社区添加了许多功能用于提高Kafka群集的安全性,Kafka提供SSL或者SASL两种安全策略。SSL方式主要是通过CA令牌实现,此文主要介绍SASL方式。 1)SASL验证: 验证方式Kaf…

【JavaSE】Java基础语法(六):方法详解

文章目录 1. 方法概述1.1 方法的概念 2. 方法的定义和调用2.1 方法的定义2.2 方法的调用过程 3. 带参数方法的定义和调用3.1 带参数方法定义和调用3.2 形参和实参 4. 带返回值方法的定义和调用4.1 带返回值方法定义和调用4.2 带返回值方法的练习-求两个数的最大值(应用) 5. 方法…

【链接】深入理解PLT表和GOT表

系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于多处理器编程的艺术进行的,每个知识点的修正和深入主要…

nest日志包pino、winston配置-懒人的折腾

nest日志 三种node服务端日志选型 winstonpinolog4js 2023年5月23日 看star数:winston > pino > log4js 使用体验: pino 格式简洁,速度快,支持输入日志到任意数据库,日志暂无自动清理(可能是我…

AI是怎么帮我写代码,写SQL的?(本文不卖课)

近期,ChatGPT风起云涌,“再不入局,就要被时代淘汰”的言论甚嚣尘上,借着这一波创业的朋友都不止3-4个,如果没记错,前几次抛出该言论的风口似乎是区块链,元宇宙,WEB3.0。 画外音&…

动态规划问题实验:数塔问题

目录 前言实验内容实验流程实验过程实验分析伪代码代码实现分析算法复杂度用例测试 总结 前言 动态规划是一种解决复杂问题的方法,它将一个问题分解为若干个子问题,然后从最简单的子问题开始求解,逐步推导出更复杂的子问题的解,最…

绝世内功秘籍《调试技巧》

本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 内容专栏:这里是《C知识系统分享》专栏,笔者用重金(时间和精力)打造,基础知识一网打尽,希望可以帮到读者们哦。 内…

CloudQuery v2.0.0 发布 新增数据保护、数据变更、连接管理等功能

哈喽社区的小伙伴们,经过一个月的努力,CloudQuery 社区版发布了全新 v2.0.0系列! 对比 v1.5.0,v2.0.0 在整体 UI 界面上就做了很大调整,功能排布我们做了重新梳理,可以说,社区版 v2.0.0 带领 C…

Linux——makefile自动化构建工具

一. 前言 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能…

数据结构的定义

主要的定义 数据 描述客观事物的数和字符的集合,比如文字,数字和特殊符号 基本单元:数据元素 一个数据单元由若干个数据项构成 数据项:具有独立含义的数据最小单元,也称字段或域 数据元素&…

Spring Boot 中的 Starter 是什么?如何创建自定义 Starter?

Spring Boot 中的 Starter 是什么?如何创建自定义 Starter? Spring Boot 是一个快速构建应用程序的框架,它提供了一种简单的方式来快速启动和配置 Spring 应用程序。Spring Boot Starter 是 Spring Boot 的一个重要概念,它可以帮…