JAVA-枚举的使用

目录

一、枚举的意义

二、enum类的使用

1.switch

2.常用方法

2.1 values() 和 ordinal()

2.1.1 Enum基本介绍

2.2 valueOf()

2.3 compareTo()

三、枚举的优点和缺点

四、枚举安全在什么地方


一、枚举的意义

public static final int RED = 1;
public static final int GREEN = 2;
public static final int BLACK = 3;

让常量有类型,虽然final修饰的也可以做为常量但是如果代码其他地方有用到常量1,而不是代表RED那就会混淆意思。这个时候我们就可以用枚举。

public enum TestEnum {RED,BLACK,GREEN;
}
优点:将常量组织起来统一进行管理
场景:错误状态码,消息类型,颜色的划分,状态机等等 ....
注意:
枚举类型默认继承了   java.lang.Enum ,也就是说,自己写的枚举类,就算没有显示的继承 Enum ,但是其默认继承了 这个类。

二、enum类的使用

1.switch

public static void main(String[] args) {EnumTest enumTest = RED;switch (enumTest) {case RED -> System.out.println(RED);case BLACK -> System.out.println(BLACK);case GREEN -> System.out.println(GREEN);}//输出RED}

2.常用方法

Enum类的常用方法:

方法名称
描述
values()
以数组形式返回枚举类型的所有成员
ordinal()
获取枚举成员的索引位置
valueOf()
将普通字符串转换为枚举实例
compareTo()
比较两个枚举成员在定义时的顺序

2.1 values() 和 ordinal()

    public static void main2(String[] args) {EnumTest[] enumTests = EnumTest.values();for (int i = 0; i < enumTests.length; i++) {System.out.print(enumTests[i] + " " + enumTests[i].ordinal() + "\n");}}

结果:

2.1.1 Enum基本介绍

Enum的构造方法

Enum类只有这一个构造方法,但是我们写的枚举类并没有写构造方法,我们知道如果我们没写构造方法,会有一个没有任何参数的构造方法。但是父类只有这两个参数的构造方法。其实也是帮我们写了有两个参数的方法,传的值是null。所以枚举类是比较特殊的

如果我们自己创建一个构造方法:

  • 构造函数是
  • zh当枚举对象有参数后,需要提供相应的构造函数
    public enum EnumTest {//有了自己的构造方法,就必须在这里写的时候带参数RED("red",0),BLACK("black",1),GREEN("green",2);private String name;private int key;/*** 1、当枚举对象有参数后,需要提供相应的构造函数* 2、枚举的构造函数默认是私有的 这个一定要记住* @param name* @param key*/private EnumTest(String name, int key) {this.name = name;this.key = key;}
    }

注意: 枚举内是不能手动创建对象的

那么问题来了,不创建对象怎么调用构造方法?

这也是为什么被说为是:枚举对象

name就做为名字,ordinal就做为创建的顺序。

我们也可以通过调试看看刚刚创建的数组是怎么样表示的:

ordinal()就是直接返回的ordinal

2.2 valueOf()

将普通字符串转换为枚举实例

字符串必须的以有的枚举对象,如果不是枚举对象会报错

public enum EnumTest {RED("red",0),BLACK("black",1),GREEN("green",2);public static void main(String[] args) {EnumTest val = EnumTest.valueOf("BLACK");System.out.println(val);}
}

如果不是枚举对象: 

结果:

2.3 compareTo()

比较两个枚举成员在定义时的顺序

public static void main(String[] args) {//方式1 适合在枚举类内部使用System.out.println(RED.compareTo(BLACK));//方式2 适合在枚举类外时使用EnumTest enumTest1 = EnumTest.RED;EnumTest enumTest2 = EnumTest.BLACK;System.out.println(enumTest1.compareTo(enumTest2));
}

结果:

根据ordinal的值比较 

三、枚举的优点和缺点

优点:
1. 枚举常量更简单安全 。
2. 枚举具有内置方法 ,代码更优雅
缺点:
1. 不可继承,无法扩展

四、枚举安全在什么地方

我们知道利用反射无论是否是私有的,都可以被反射拿到甚至更改但是枚举是不可以的。

    public static void reflectPrivateConstructor() {Class<?> c1 = null;try {c1 = Class.forName("EnumTest");//拿到构造方法Constructor<EnumTest> constructor =(Constructor<EnumTest>)c1. //前两个传的是父类的构造方法参数,和两个是子类的构造方法参数  getDeclaredConstructor(String.class,int.class,String.class,int.class);constructor.setAccessible(true);//创建类的实例EnumTest testEnum = constructor.newInstance("test",10,"白色",19);System.out.println(testEnum);} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (NoSuchMethodException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}public static void main4(String[] args) {reflectPrivateConstructor();}

警告: 

 是在这个函数出错的,我们去看看是什么问题

 因为这一条判断语句,枚举类型不能被反射,所以枚举类型是安全的

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

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

相关文章

华中科技大学软件学院专硕怎样?

华中科技大学软件工程以顶尖的学科实力、扎实的产研融合和广阔的就业前景&#xff0c;持续吸引优质生源。尽管竞争激烈&#xff0c;但通过科学的备考规划与持续努力&#xff0c;完全可能实现名校梦想。建议26届考生锚定目标、拆分任务、善用华科开源社区资源&#xff08;如HUST…

【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA

【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA data source1: BH coordination tabledata source2:BH layer tableprocess 1:Collect BH List To Layer Tableprocess 2:match Reduced Level from "Layer"+"BH"data source1: BH coordination…

1.【线性代数】——方程组的几何解释

1.方程组的几何解释 概述举例举例一1. matrix2.row picture3.column picture 概述 三种表示方法 matrixrow picturecolumn picture 举例 举例一 { 2 x − y 0 − x 2 y 3 \begin{cases} 2x - y 0 \\ -x 2y 3 \end{cases} {2x−y0−x2y3​ 1. matrix [ 2 − 1 − 1 2…

智慧机房解决方案(文末联系,领取整套资料,可做论文)

智慧机房解决方案-软件部分 一、方案概述 本智慧机房解决方案旨在通过硬件设备与软件系统的深度整合&#xff0c;实现机房的智能化管理与服务&#xff0c;提升机房管理人员的工作效率&#xff0c;优化机房运营效率&#xff0c;确保机房设备的安全稳定运行。软件部分包括机房管…

macbook2015升级最新MacOS 白苹果变黑苹果

原帖&#xff1a;https://www.bilibili.com/video/BV13V411c7xz/MAC OS系统发布了最新的Sonoma&#xff0c;超酷的动效锁屏壁纸&#xff0c;多样性的桌面小组件&#xff0c;但是也阉割了很多老款机型的升级权利&#xff0c;所以我们可以逆向操作&#xff0c;依旧把老款MAC设备强…

深度剖析责任链模式

一、责任链模式的本质&#xff1a;灵活可扩展的流水线处理 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是行为型设计模式的代表&#xff0c;其核心思想是将请求的发送者与接收者解耦&#xff0c;允许多个对象都有机会处理请求。这种模式完美解决了以下…

业务开发 | 基础知识 | Maven 快速入门

Maven 快速入门 1.Maven 全面概述 Apache Maven 是一种软件项目管理和理解工具。基于项目对象模型的概念&#xff08;POM&#xff09;&#xff0c;Maven 可以从中央信息中管理项目的构建&#xff0c;报告和文档。 2.Maven 基本功能 因此实际上 Maven 的基本功能就是作为 Ja…

使用 Apifox、Postman 测试 Dubbo 服务,Apache Dubbo OpenAPI 即将发布

作者&#xff1a;何亮&#xff0c;Apache Dubbo Contributor Apache Dubbo OpenAPI 简介 设计背景 在微服务体系中&#xff0c;RPC 服务的文档管理、测试、调用协作一直都是影响研发效能的关键一环&#xff0c;这些难题通常是由于 RPC 的特性所决定的&#xff1a;RPC 服务的…

2.11 sqlite3数据库【数据库的相关操作指令、函数】

练习&#xff1a; 将 epoll 服务器 客户端拿来用 客户端&#xff1a;写一个界面&#xff0c;里面有注册登录 服务器&#xff1a;处理注册和登录逻辑&#xff0c;注册的话将注册的账号密码写入数据库&#xff0c;登录的话查询数据库中是否存在账号&#xff0c;并验证密码是否正确…

C++模拟实现AVL树

目录 1.文章概括 2.AVL树概念 3.AVL树的性质 4.AVL树的插入 5.旋转控制 1.左单旋 2. 右单旋 3.左右双旋 4.右左双旋 6.全部代码 1.文章概括 本文适合理解平衡二叉树的读者阅读&#xff0c;因为AVL树是平衡二叉树的一种优化&#xff0c;其大部分实现逻辑与平衡二叉树是…

python-leetcode 25.环形链表

题目&#xff1a; 给定一个链表的头节点head,判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪next指针再次到达&#xff0c;则链表中存在环。为了表示给定链表中的环&#xff0c;评测系统内部使用整数pos来表示链表尾连接到链表中的位置&#xff08;…

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势

作者&#xff1a;谢吉宝&#xff08;唐三&#xff09; 编者按&#xff1a; 云原生 API 网关系列教程即将推出&#xff0c;欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家&#xff0c;云原生产品线中间件负责人谢吉宝&#xff08;唐三&#xff09; 在云栖大会的精…

SQL Server安装流程

SQL Server 2022在安全性、可用性和性能方面不断创新&#xff0c;是现在最支持Azure的SQL Server版本。 SQL Server发展史 SQL Server的历史始于1989年&#xff0c;当时是由微软与Sybase合作的产品&#xff0c;旨在为Windows NT操作系统提供一个高性能的数据库解决方案。随着…

C# 上位机--变量

C# 上位机--变量 在 C# 上位机开发领域&#xff0c;变量是构建程序逻辑的基础元素之一。它就像是一个容器&#xff0c;用于存储各种类型的数据&#xff0c;从简单的数值到复杂的对象。正确理解和使用变量&#xff0c;对于开发出高效、稳定且易于维护的上位机程序至关重要。本文…

Vue3(1)

一.create-vue // new Vue() 创建一个应用实例 > createApp() // createRouter() createStore() // 将创建实例进行了封装&#xff0c;保证每个实例的独立封闭性import { createApp } from vue import App from ./App.vue// mount 设置挂载点 #app (id为app的盒子) createA…

Redis 数据类型 List 列表

列表类型是⽤来存储多个有序的字符串&#xff0c;如下图所⽰&#xff0c;a、b、c、d、e 五个元素从左到右组成了⼀个有序的列表&#xff0c;列表中的每个字符串称为元素&#xff08;element&#xff09;&#xff0c;⼀个列表最多可以存储 2^32 - 1个元素。在 Redis 中&#xff…

yum报错 Could not resolve host: mirrorlist.centos.org

检查dns 使用ping www.baidu.com &#xff0c;如果ping不通&#xff0c;检查/etc/resolv.conf文件中是否有&#xff1a; nameserver 8.8.8.8 nameserver 8.8.4.4 替换yum源 1.备份原始的 YUM 源配置文件&#xff1a; sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.r…

STM32F103C8----外部中断探秘:解锁嵌入式实时响应的关键

​​​ 一、引言 在嵌入式系统的广袤世界里&#xff0c;中断就如同一位高效的调度员&#xff0c;发挥着举足轻重的作用。想象一下&#xff0c;一个嵌入式系统就像一个繁忙的工厂&#xff0c;CPU 如同工厂里的核心工人&#xff0c;负责执行各种任务。如果没有中断机制&#x…

分层解耦-IOC DI 入门

步骤 ①.Service层及 Dao层的实现类&#xff0c;交给I0C容器管理。 ②.为Controller及Service注入运行时&#xff0c;依赖的对象。 ③.运行测试。 添加注解进行分层耦合 Component 会将当前类交给IOC容器管理,成为IOC容器中的bean - 控制反转 Autowired 运行时,IOC容器…

SQL Server 逻辑查询处理阶段及其处理顺序

在 SQL Server 中&#xff0c;查询的执行并不是按照我们编写的 SQL 语句的顺序进行的。相反&#xff0c;SQL Server 有自己的一套逻辑处理顺序&#xff0c;这个顺序决定了查询的执行方式和结果集的生成。了解这些处理阶段和顺序对于优化查询性能和调试复杂查询非常重要。 SQL …