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

JavaSE进阶之(十六)枚举

十六、枚举

  • 16.1 背景
  • 16.2 枚举类型
  • 16.3 EnumSet 和 EnumMap
    • 01、EnumSet
    • 02、EnumMap

16.1 背景

在 Java 语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组 int 类型的常量,常常用的就是:

public static final int SPRING = 1;
public static final int SUMMER = 2;
public static final int AUTUMN = 3;
public static final int WINTER = 4;

看似这样写是没有问题的,但是我们写代码的时候通常都会考虑到它的安全性、易用性和可读性。

首先是安全性。显然,这种模式并不是安全的。就拿上面的例子来说,我们根本无法保证传入值的合法性,在编译期和运行期不知道可能会出现什么情况,这就不符合 Java 程序的类型安全了。

其次是可读性。使用枚举类型的大多数场合都是为了方便得到枚举类型的描述(也就是字符串表达式),如果我们只是单一的打印出来这一组数字,也没有太大的用处。这时如果使用 String 来替代 int 作为常量,也不是不可以的,但是可能会导致性能问题,因为它依赖于字符串的比较操作。

从类型安全和程序可读性两方面考虑,int 和 String 枚举模式的缺点就暴露出来了。这时就引入了一个新的解决方案,就是枚举类型(enum type)

16.2 枚举类型

枚举(enum)是 Java 1.5 时引入的关键字,它标识一种特殊类型的类,继承自 java.lang.Enum,由一组固定的常量组成合法的类型。

新建一个枚举类 Season.java:

/*** 季节枚举类** @author qiaohaojie* @date 2023/3/22  14:07*/
public enum Season {SPRING(1),SUMMER(2),AUTUMN(3),WINTER(4);private int code;Season(int code) {this.code = code;}public int getCode() {return code;}
}

其实在这个类中,我们并没有看到有继承关系的,来扒一下反编译后的字节码:

public final class Season extends Enum
{public static Season [] values(){return (Season [])$VALUES.clone();}public static Season valueOf(String name){return (Season )Enum.valueOf(com/qhj/enumtype/Season, name);}private Season(String s, int i){super(s, i);}public static final int SPRING;public static final int SUMMER;public static final int AUTUMN;public static final int WINTER;private static final Season $VALUES[];static {SPRING= new Season ("SPRING", 0);SUMMER= new Season ("SUMMER", 1);AUTUMN= new Season ("AUTUMN", 2);WINTER= new Season ("WINTER", 3);$VALUES = (new Season[] {SPRING, SUMMER, AUTUMN, WINTER});}
}

Java 编译器帮我们做了很多隐式的工作:

  1. 要继承 Enum 类;
  2. 要写构造方法;
  3. 要声明静态变量和数组;
  4. 要用 static 块来初始化静态变量和数组;
  5. 要提供静态方法,比如 values() 和 valueOf(String name)。

作为开发者,我们的代码量减少了,枚举看起来简洁明了。

既然枚举是一种特殊的类,那么它其实是可以定义在一个类的内部的,这样它的作用域就可以限定于这个外部类中使用:

/*** 枚举定义在外部类中** @author qiaohaojie* @date 2023/3/22  22:28*/
public class SeasonClass {private Season season;public enum Season {SPRING(1),SUMMER(2),AUTUMN(3),WINTER(4);private int code;Season(int code) {this.code = code;}public int getCode() {return code;}}public boolean isSeason() {return getSeason() == Season.AUTUMN;}public Season getSeason() {return season;}public void setSeason(Season season) {this.season = season;}
}

Season 就相当于 SeasonClass 的内部类。

由于枚举是 final 的,所以可以确保在 Java 虚拟机中仅有一个常量对象,基于这个原因,我们可以使用 “==” 运算符来比较两个枚举是否相等,比如上面的 isSeason() 方法。

至于为什么不用 equals() 方法呢?

  1. 首先,“==” 运算符比较的时候,如果两个对象都为 null,并不会发生 NullPointerException,而 equals() 方法就会发生。
    在这里插入图片描述

  2. 另外,“==” 运算符会在编译时进行检查,如果两侧的类型不匹配,就会提示错误,而 equals() 方法则不会:在这里插入图片描述

另外,枚举还可以用于 switch 语句,和基本数据类型的用法一致:

public static String getChineseSeason(Season season) {StringBuffer result = new StringBuffer();switch (season) {case SPRING:result.append("[中文:春天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");break;case SUMMER:result.append("[中文:夏天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");break;case AUTUMN:result.append("[中文:秋天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");break;case WINTER:result.append("[中文:冬天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");break;}

如果枚举中需要包含更多信息的话,可以为其添加一些字段,比如:code、name 等,这时就需要为枚举添加一个带参的构造方法,这样就可以在定义枚举时添加对应的名称了。

16.3 EnumSet 和 EnumMap

01、EnumSet

EnumSet 是一个专门针对枚举类型的 Set 接口的实现类,它是处理枚举类型数据的一把利器,非常高效的。从名字上也可以看得出,EnumSet 不仅和 Set 有关系,也和枚举有关系。

因为 EnumSet 是一个抽象类,所以创建 EnumSet 时不能使用 new 关键字,但是 EnumSet 提供了很多有用的静态工厂方法。

举个例子,我们可以使用 noneOf) 静态工厂方法创建一个空的 Season 类型的 EnumSet;使用 allOf() 静态工厂方法创建一个包含所有 Season 类型的 EnumSet:

/*** @author qiaohaojie* @date 2023/3/22  22:41*/
public class SeasonClassTest {public static void main(String[] args) {EnumSet<Season> enumSetNone = EnumSet.noneOf(Season.class);System.out.println(enumSetNone); // []EnumSet<Season> enumSetAll = EnumSet.allOf(Season.class);System.out.println(enumSetAll); // [SPRING, SUMMER, AUTUMN, WINTER]}
}

有了 EnumSet 后,就可以使用 Set 的一些方法了:
在这里插入图片描述

02、EnumMap

EnumMap 是一个专门针对枚举类型的 Map 接口的实现类,它可以将枚举常量作为键来使用。EnumMap 的效率甚至比 HashMap 还要高,可以直接通过数组下标(枚举的 ordinal 值)访问到元素。

与 EnumSet 不同的是,EnuMap 不是一个抽象类,所以创建 EnumMap 时可以使用 new 关键字:

/*** @author qiaohaojie* @date 2023/3/22  22:41*/
public class SeasonClassTest {public static void main(String[] args) {EnumMap<Season, String> enumMap = new EnumMap<Season, String>(Season.class);enumMap.put(Season.SPRING, "春天");enumMap.put(Season.SUMMER, "夏天");enumMap.put(Season.AUTUMN, "秋天");enumMap.put(Season.WINTER, "冬天");System.out.println(enumMap); // {SPRING=春天, SUMMER=夏天, AUTUMN=秋天, WINTER=冬天}}
}

相关文章:

JavaSE进阶之(十六)枚举

十六、枚举16.1 背景16.2 枚举类型16.3 EnumSet 和 EnumMap01、EnumSet02、EnumMap16.1 背景 在 Java 语言中还没有引入枚举类型之前&#xff0c;表示枚举类型的常用模式是声明一组 int 类型的常量&#xff0c;常常用的就是&#xff1a; public static final int SPRING 1; …...

全同态加密:TFHE

参考文献&#xff1a; Cheon J H, Stehl D. Fully homomophic encryption over the integers revisited[C]//Advances in Cryptology–EUROCRYPT 2015: 34th Annual International Conference on the Theory and Applications of Cryptographic Techniques, Sofia, Bulgaria, …...

【计算机二级】综合题目

计算机二级python真题 文章目录计算机二级python真题一、《大学慕课 两问 》二、综合应用题——价值链三、基本操作题 ——信息输出一、《大学慕课 两问 》 附件中的文件data.txt 是教育部爱课程网中国大学MOOC平台的某个 HTML页面源文件,里面包含了我国参与MOOC建设的一批大学…...

初识Kafka

介绍 Kafka Kafka 是一款基于发布与订阅的消息系统。 用生产者客户端 API 向 Kafka 生产消息&#xff0c;用消费者客户端 API 从 Kafka 读取这些消息。 Kafka 使用 Zookeeper 保存元数据信息。 Kafka 0.9 版本之前&#xff0c;除了 broker 之外&#xff0c; 消费者也会使用…...

【JavaEE】线程的状态

哈喽&#xff0c;大家好~我是保护小周ღ&#xff0c;本期为大家带来的是 Java 多线程的 线程的状态&#xff0c;New 新建状态&#xff0c;Runnable 运行状态&#xff0c;Blocked 阻塞状态&#xff0c;waiting 等待状态&#xff0c;Time_Waiting 超时等待状态&#xff0c;Termin…...

7个最受瞩目的 Python 库,提升你的开发效率

当今时代&#xff0c;数据分析和处理已经成为了各行各业中不可或缺的一环。Python作为一种非常流行的编程语言&#xff0c;为我们提供了许多强大的工具和库来处理不同类型的数据。 在这篇文章中&#xff0c;我将向您介绍七个非常有用的Python库&#xff0c;这些库各自有着独特…...

这些IT行业趋势,将改变2023

上一周&#xff0c;你被"AI"刷屏了吗&#xff1f; 打开任何一家科技媒体&#xff0c;人工智能都是不变的热门话题。周初大家还在用ChatGPT写论文、查资料、写代码&#xff0c;到周末的时候大家已经开始用GPT-4图像识别来做饭、Microsoft 365 Copilot 来写PPT了。 GP…...

蓝桥杯每日一真题——[蓝桥杯 2021 省 B] 杨辉三角形(二分+规律)

文章目录[蓝桥杯 2021 省 B] 杨辉三角形题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思路&#xff1a;全部代码&#xff1a;[蓝桥杯 2021 省 B] 杨辉三角形 题目描述 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列&…...

<C++> 类和对象(下)

1.const成员函数将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的任何成员进行修改。class A { public:void Print() //这里隐藏了A* this指针{cout <…...

基于Springboot+Vue2前后端分离框架的智慧校园系统源码,智慧学校源码+微信小程序+人脸电子班牌

▶ 智慧校园开发环境&#xff1a; 1、使用springboot框架Javavue2 2、数据库MySQL5.7 3、移动端小程序使用小程序原生语音开发 4、电子班牌固件安卓7.1&#xff1b;使用Java Android原生 5、elmentui &#xff0c;Quartz&#xff0c;jpa&#xff0c;jwt 智慧校园结构导图▶ 这…...

JavaEE-线程安全问题

1.线程安全的概念 如果多线程环境下代码运行的结果是符合我们预期的&#xff0c;即在单线程环境应该的结果&#xff0c;则说这个程序是线 程安全的. 为啥会出现线程安全问题? 本质原因: 线程在系统中的调度是无序的/随机的 (抢占式执行). 2.开始说明 先看个线程不安全的例子…...

【Node.js】身份认证,Cookie和Session的认证机制,express中使用session认证和JWT认证

Node.jsWeb开发模式如何选择Web开发模式身份认证什么是身份认证为什么要身份认证不同开发模式的身份认证Session认证机制提高身份认证的安全性Session的工作原理Express中使用Session认证Session认证机制的局限性JWT认证机制JWT的工作原理JWT的组成部分Express中使用JWT在登录成…...

Redis删除策略和淘汰策略

一、删除策略 删除策略就是针对已过期数据的处理策略。 针对过期数据要进行删除的时候都有哪些删除策略呢&#xff1f; 1.定时删除2.惰性删除3.定期删除1、立即删除 当key设置有过期时间&#xff0c;且过期时间到达时&#xff0c;由定时器任务立即执行对键的删除操作。 优…...

LFM雷达实现及USRP验证【章节2:LFM雷达测距】

目录 1. 参数设计 几个重要的约束关系 仿真参数设计 2. matlab雷达测距代码 完整源码 代码分析 回顾&#xff1a;LFM的基本原理请详见第一章 本章节将介绍LFM雷达测距的原理及实现 1. 参数设计 几个重要的约束关系 带通采样定理&#xff1a; 因此如果我们B80MHz时&a…...

菜鸟刷题Day5

⭐作者&#xff1a;别动我的饭 ⭐专栏&#xff1a;菜鸟刷题 ⭐标语&#xff1a;悟已往之不谏&#xff0c;知来者之可追 一.一维数组的动态和&#xff1a;1480. 一维数组的动态和 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个数组 nums 。数组「动态和」的计算公式…...

已解决AttributeError:module tensorflow no attribute app异常的正确解决方法,亲测有效!!!

已解决AttributeError&#xff1a;module tensorflow no attribute app异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 文章目录报错问题解决方法福利报错问题 粉丝群里面的一个小伙伴敲代码时发生了报错&#xff08;当时他心里瞬间凉了一大截&…...

Hadoop集群环境配置搭建

一、简单介绍 Hadoop最早诞生于Cutting于1998年左右开发的一个全文文本搜索引擎 Lucene&#xff0c;这个搜索引擎在2001年成为Apache基金会的一个子项目&#xff0c;也是 ElasticSearch等重要搜索引擎的底层基础。 项目官方&#xff1a;https://hadoop.apache.org/ 二、Linux环…...

Thread类的基本用法

Thread类的基本用法&#x1f50e;1.线程创建&#x1f33b;继承Thread类&#x1f33c;继承Thread重写run()方法&#x1f33c;继承Thread匿名内部类&#x1f33b;实现Runnable接口&#x1f33c;实现Runnable接口重写run()方法&#x1f33c;实现Runnable接口匿名内部类&#x1f33…...

YOLOV8改进:如何增加注意力模块?(以CBAM模块为例)

YOLOV8改进&#xff1a;如何增加注意力模块&#xff1f;&#xff08;以CBAM模块为例&#xff09;前言YOLOV8nn文件夹modules.pytask.pymodels文件夹总结前言 因为毕设用到了YOLO&#xff0c;鉴于最近V8刚出&#xff0c;因此考虑将注意力机制加入到v8中。 YOLOV8 代码地址&am…...

Spark Streaming DStream的操作

一、DStream的定义 DStream是离散流&#xff0c;Spark Streaming提供的一种高级抽象&#xff0c;代表了一个持续不断的数据流。DStream可以通过输入数据源来创建&#xff0c;比如Kafka、Flume&#xff0c;也可以通过对其他DStream应用高阶函数来创建&#xff0c;比如map、redu…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...