数据结构:枚举

news2024/9/21 23:43:30

概念


枚举主要用途是:将一组常量组织起来,在这之前表示一组常量通常使用定义常量的方式:

比如下面的例子:

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

利用常量表示RED,GREEN,BLACK既繁琐又容易出错

如果程序里面还有一个int a = 1,那程序可能会认为是RED,用枚举来组织可以轻松解决这些问题

public enum TestEnum {
    RED,BLACK,GREEN;
}

创建枚举类


使用

1.用switch语句来匹配对应的颜色

public enum TestEnum {
    RED,GREEN,BLACK;

    public static void main(String[] args) {
        TestEnum color = RED;//定义目标颜色
        switch(color){
            case GREEN:
                System.out.println("GREEN");
                break;
            case RED:
                System.out.println("RED");
                break;
            case BLACK:
                System.out.println("BLACK");
                break;
            default:
                System.out.println("error");
                break;
        }
    }
}

2.常用方法

方法名称

描述

values()

以数组的形式返回枚举成员

ordinal()

获取枚举成员索引位置

valueOf()

将普通字符串转成枚举实例

compareTo()

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

这些方法是被继承过来的,默认继承于枚举类

但是我们在这里面没有找到values,那这个方法怎么可以被调用呢?

这是由于java编译器在对enum关键字进行处理时,实际上是将enum转换成为了java.lang.Enum类的一个子类来完成,而这个子类中含有values()静态方法。这一点,可以通过反编译enum类来查看。

如图,通过javap反编译enum枚举类,可以看到编译器在对enum处理时,实际上是转换成了Enum的一个子类来实现的,里面可以看到有values()静态方法的声明。


枚举的构造方法

⚠枚举构造方法默认是private的,所以写不写private没影响

    RED(1,"红色"),
    GREEN(2,"绿色"),
    BLACK(3,"黑色");
    private int ordinal;
    private String color;
    TestEnum(int ordinal, String color){
        this.ordinal = ordinal;
        this.color = color;
    }

这也是枚举本身的一个缺点,它无法继承也无法扩展


枚举和反射

既然枚举里面的构造方法是私有的,那我们可不可以用反射来实例化一个枚举对象呢?

我们来试试看

    public static void func() throws ClassNotFoundException, NoSuchMethodException,
            InvocationTargetException, InstantiationException,
            IllegalAccessException {
        //反射Enum类
        Class<?> c1 = Class.forName("demo2.TestEnum");
        //获取Enum类里面私有变量的类型
        Constructor<?> constructor = c1.getDeclaredConstructor(int.class, String.class);
        constructor.setAccessible(true);//私有的要设置true,允许获取
        //实例化新对象
        TestEnum testEnum = (TestEnum) constructor.newInstance(6,"棕色");
        System.out.println(testEnum);
    }

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException,
            InvocationTargetException, InstantiationException,
            IllegalAccessException {
        func();
    }

当我们运行起来的时候,发现程序报错了

报错信息说我没有int, java.lang.String这两个参数

诶我在前面的构造方法不是传入这两个参数了吗?

其实我一开始写的TestEnum是继承于Enum这个类的,相当于我们既要反射TestEnum类,也要反射Enum类

(Enum里面的构造函数)

也就是说我们在c1.getDeclaredConstructor()里面传入四个参数,🆗我照做

但是怎么又抛了一个异常给我

我们点开Constructor的源码,注意到这句话

这句话意思是当我们试图创建一个枚举类时,程序就会抛一个异常出来,不允许我们创建这个类

所以不可以用反射来实例化一个枚举对象

换句话说,枚举十分安全。特别地,用枚举来实现单例模式非常安全

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

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

相关文章

想做副业在哪里找?做好这些副业平台就够了

每个人在生活中都有一些额外的需求和理想&#xff0c;所以越来越多的人开始寻找副业来实现小目标。但是&#xff0c;但是寻找副业的过程并不容易&#xff0c;需要考虑到自己的时间和能力&#xff0c;还有选择一个靠谱的平台。其实&#xff0c;副业平台并不太难&#xff0c;只要…

被OpenAI开除后,创始人奥特曼在微软找到了新工作

微软首席执行官纳德拉宣布&#xff0c;OpenAI创始人Sam Altman和Brockman及其同事将加入微软。随后&#xff0c;Altman转发了他的推特。 此前&#xff0c;外媒消息称&#xff0c;OpenAI首席科学家伊尔亚苏茨克维&#xff08;Ilya Sutskever&#xff09;周日晚告知公司员工&…

springboot中动态api如何设置

1.不需要编写controller 等mvc层&#xff0c;通过接口动态生成api。 这个问题&#xff0c;其实很好解决&#xff0c;以前编写接口&#xff0c;是要写controller&#xff0c;需要有 RestController RequestMapping("/test1") public class xxxController{ ApiOperat…

使用 Amazon VPS 探索存储选项:实用指南

文章作者&#xff1a;Libai 在这个数字化时代&#xff0c;云计算已经成为了企业的必需品&#xff0c;它为我们带来了可扩展性、灵活性和成本效益。作为一家领先的云服务提供商&#xff0c;亚马逊网络服务&#xff08;Amazon Web Services&#xff09;提供了各种各样的服务&…

栈和队列知识点+例题

1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素的操作。进行数据插入和删除操作的一端成为栈顶&#xff0c;另一端成为栈底。遵守后进先出的原则&#xff08;类似于弹夹&#xff09; 压栈&#xff1a;栈的插入操…

Linux搭建服务器环境,挂载SpringBoot+VUE项目

本地环境 Ubuntu20.04 服务器环境 CentOS7.6 购买服务器 以阿里云轻量服务器&#xff08;适合初学者&#xff09;为例&#xff0c;自行选择规格进行购买 购买完成后&#xff0c;获取服务器公网IP&#xff0c;同时重置密码&#xff0c;设置服务器密码 配置防火墙 点击实例ID&am…

极智嘉(Geek+)官宣重磅合作伙伴,再度赋能仓储自动化解决方案落地

近日&#xff0c;全球仓储机器人引领者极智嘉(Geek)再度官宣重磅合作伙伴&#xff0c;其与全球先进的物流自动化和软件公司FORTNA达成了战略合作。 当前&#xff0c;电商领域发展迅速&#xff0c;高效、可拓展的订单履行方案需求急剧增长。基于这一形势&#xff0c;极智嘉与FO…

OpenCV [c++](图像处理基础示例小程序汇总)

OpenCV [c++](图像处理基础示例小程序汇总) 推荐 原创 NCUTer 2023-04-04 14:18:49 文章标签 Image 图像处理 文章分类 计算机视觉 人工智能 在51CTO的第一篇博文 阅读数1467 一、图像读取与显示 #include<opencv2/opencv.hpp> #include<iostream>using…

git问题: git@10.18.*.*: Permission denied (publickey,password)

遇到的问题&#xff1a; openSSH版本太高&#xff0c;openssh高版本默认禁止ssh-rsa加密算法&#xff0c;直接换ed25519 执行以下命令&#xff1a; 在.ssh目录下执行&#xff1a;ssh-keygen -t ed25519 -C “youremail.com” ssh-add ~/.ssh/id_ed25519 将id_ed25519.pub添加…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑多重不确定性和潜在博弈的楼宇群电能优化调度策略》

这个标题涉及到楼宇群电能的优化调度策略&#xff0c;并强调了两个重要的方面&#xff1a;多重不确定性和潜在博弈。 楼宇群电能优化调度策略&#xff1a; 这指的是在一个涉及多个楼宇&#xff08;建筑物&#xff09;的群体中&#xff0c;对电能的使用进行优化调度的策略。这可…

深度学习(小土堆)

self代表当前类的实例&#xff0c;并用于访问实例的属性和方法,主要方便后面访问属性或者方法。 启动事件文件夹 进行上一步需要在pycharm中设置当打开Terminal终端时&#xff0c;自动进入虚拟环境 防止与别人冲突可以修改端口号 将图像的数据类型转为numpy trans…

微信小程序配置企业微信的在线客服

配置企业微信后台 代码实现 <button tap"openCustomerServiceChat">打开企业微信客服</button>methods: {openCustomerServiceChat(){wx.openCustomerServiceChat({extInfo: {url: 你刚才的客服地址},corpId: 企业微信的id,showMessageCard: true,});} …

【小黑嵌入式系统第九课】PSoC 5LP第一个实验——LED、字符型LCD显示实验

上一课&#xff1a; 【小黑嵌入式系统第八课】初识PSoC Creator™开发——关于PSoC Creator&下载、创建项目、单片机中的hello world&#xff08;点亮一个led) 文章目录 1 实验目的2 实验要求3 实验设备4 实验原理1. 基于 PWM 原理的 LED 亮度控制2. 时间的计量3. 按键抖动…

FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(2)

FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法&#xff08;2&#xff09; 工程目的I2C 单字节写操作I2C 随机读操作EEPROM 字节读写整体框图模块功能简介I2C 驱动模块模块框图跨时钟域处理状态转移图 波形分析单字节写操作局部波形图&#xff08;一&#xff09;单字节写…

IP地址的分包与组包:网络通信的关键技术解析

在计算机网络中&#xff0c;IP地址的分包与组包是网络通信过程中关键的技术环节&#xff0c;分别涉及将数据拆分为适当大小的包以及在接收端重新组装这些包的过程。这两个过程对于确保高效、可靠的数据传输至关重要。以下将深入探讨IP地址的分包与组包的概念、原理以及在网络通…

进程管理(三)

生产者—消费者问题及初步解决方案 放了数据后,有通知消费者的义务。 空缓冲区、满缓冲区作为资源,设计为信号量 关于生产者—消费者初步解决方案的反思 秘诀:资源信号量wait在前,互斥信号量wait在后 关于生产者—消费者初步解决方案的改进

Linux常见命令手册

目录 文件命令 文件和目录命令 文件的权限命令 文件搜索命令 进程命令 查看进程命令 关闭进程命令 用户和群组命令 网络命令 firewall-cmd 网络应用命令 高级网络命令 网络测试命令 网络安全命令 网络配置命令 软件管理命令 系统信息命令 vi编辑器 关机命令…

2023年中国位置服务(LBS)产业链及市场规模分析[图]

卫星导航系统的高技术、高成本、高效益属性使其成为国家经济实力与科技实力的标志之一。卫星导航系统由空间段、地面段和用户段三个部分组成&#xff0c;已广泛用于交通运输、农林牧渔、航空航海等领域&#xff0c;服务载体包括手机、汽车、无人机、导弹等&#xff0c;对人们生…

Dubbo快速实践

文章目录 架构相关概念集群和分布式架构演进 Dubbo概述Dubbo快速入门前置准备配置服务接口配置Provider配置Consumer Dubbo基本使用总结 本文参考https://www.bilibili.com/video/BV1VE411q7dX 架构相关概念 集群和分布式 集群&#xff1a;很多“人”一起 &#xff0c;干一样…

数据结构与算法-生成树与最小生成树

生成树与最小生成树 &#x1f388;1.生成树与最小生成树&#x1f52d;1.1生成树与最小生成树的概念&#x1f52d;1.2最小生成树的生成准则&#x1f52d;1.3两种最小生成树算法&#x1f3c6;1.3.1Kruskal算法&#x1f3c6;1.3.2Prim算法 &#x1f388;2.有向无环图及其应用&…