枚举【Java】

news2024/11/28 4:30:37

文章目录

    • 枚举的使用
      • switch语句
      • Enum类的常用方法
      • 枚举的构造方法
    • 反射与枚举

在之前的学习中,如果我们需要组织一组枚举类型的数据,我们通常会使用常量来进行定义。但这种定义方式存在一个问题就是:如果在一个程序中,普通常量和使用该常量定义的枚举类型同时出现,就极有可能会产生混淆。因此为了避免这种情况的出现,在JDK1.5之后,java就引入了枚举类型Enum。

枚举是java.lang.Enum的子类,自己写的枚举类,即使没有显式地继承Enum,也依然默认继承了该类;

枚举的使用

switch语句


public enum EnumTest {
    //定义枚举常量
    RED,ORANGE,YELLOW,BLUE,GREEN;

    public static void main(String[] args) {
        EnumTest enumTest=EnumTest.BLUE;
        //switch语句的的变量可以是枚举类型
        switch (enumTest){
            case RED:
                System.out.println("红色");
            case ORANGE:
                System.out.println("橙色");
            case YELLOW:
                System.out.println("黄色");
            case BLUE:
                System.out.println("蓝色");
            case GREEN:
                System.out.println("绿色");
        }
    }
}

Enum类的常用方法

在这里插入图片描述
使用代码演示具体的使用方法:

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 晨曦
 * Date: 2023-05-14
 * Time: 16:01
 */
public enum EnumTest {
    //定义枚举常量
    RED,ORANGE,YELLOW,BLUE,GREEN;

    public static void main(String[] args) {
        //values()以数组形式返回枚举类型的所有成员
        EnumTest [] tests=EnumTest.values();
        for (int i=0;i<tests.length;i++){
            //ordinal()获取枚举成员的索引位置
            System.out.println(tests[i].ordinal()+": "+tests[i]);
        }


        //valueOf()将括号中的字符串转换为枚举类型
        //getClass()获取变量的类型
        System.out.println(EnumTest.valueOf("BLUE").getClass().toString());

    }
}

在这里插入图片描述

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 晨曦
 * Date: 2023-05-14
 * Time: 16:01
 */
public enum EnumTest {
    //定义枚举常量
    RED,ORANGE,YELLOW,BLUE,GREEN;

    public static void main(String[] args) {

        //使用变量获取枚举实例
        EnumTest test =EnumTest.RED;
        EnumTest test1=EnumTest.YELLOW;
        //compareTo()比较两个枚举成员在定义时的顺序
        System.out.println(test.compareTo(test1));
        System.out.println(ORANGE.compareTo(GREEN));


    }
}

在这里插入图片描述

枚举的构造方法

枚举的构造方法是私有的;

public enum EnumTest2 {

    //定义枚举常量
    RED("红色",1),ORANGE("橙色",2),YELLOW("黄色",3),BLUE("蓝色",4),GREEN("绿色",5);

    private  String name;
    private int id;

    private EnumTest2(String name, int id) {
        this.name = name;
        this.id = id;
    }
    
}

枚举的构造方法不允许是public类型;
在这里插入图片描述

反射与枚举

进行反射的大致流程是:首先创建对象,再通过合适的方法达到反射的目的;

具体使用代码进行演示:

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 晨曦
 * Date: 2023-05-14
 * Time: 17:08
 */
public enum EnumTest2 {




    //定义枚举常量
    RED("红色",1),ORANGE("橙色",2),YELLOW("黄色",3),BLUE("蓝色",4),GREEN("绿色",5);

    private  String name;
    private int id;

    private EnumTest2(String name, int id) {
        this.name = name;
        this.id = id;
    }

    public static void reflectPrivate(){
        try {

            //获取类对象
            Class<?> c=Class.forName("EnumTest2");
            //获取与参数类型匹配的构造方法
            Constructor<?> constructor=c.getDeclaredConstructor(String.class,int.class);
            //修改访问权限
            constructor.setAccessible(true);
            //创建对应的实例
            EnumTest2 test=(EnumTest2) constructor.newInstance("蓝色",69);

            System.out.println(test);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        reflectPrivate();
    }

}

在上面基础代码无误的情况下,得到的运行结果是这样的:

在这里插入图片描述
出现了NoSuchMethodException的错误,根据idea提示的错误位置,定位到了getDeclaredConstructor()方法处,但该方法在之前的反射程序中却是没有问题的。是在获取枚举的构造方法时出现了问题,为了找到问题所在,我们查看Enum类的源码;

在这里插入图片描述
可以看到,Enum类的构造方法有着2个默认的参数,一个String类型的和一个int类型的;该构造方法是供编译器在响应枚举类型时自主调用,也就是说,如果我们自己的构造函数已经有2个参数,那么我们在写反射代码时就需要提供4个参数(自己的2个参数+默认的2个参数);

在这里插入图片描述
然而结果依然报错,定位到newInstance()方法,查看源码:
在这里插入图片描述
代码显示,newInstance()方法不支持枚举类;

所以,java不支持通过反射获取枚举类的实例

over!

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

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

相关文章

1053 Path of Equal Weight(超级无敌详细注释+45行代码)

分数 30 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 Given a non-empty tree with root R, and with weight Wi​ assigned to each tree node Ti​. The weight of a path from R to L is defined to be the sum of the weights of all the nodes along the pa…

UE5.1.1C++从0开始(6.两个额外的魔法弹:瞬移魔法弹和黑洞魔法弹)

做完这两个功能总共花费了一个下午加一个晚上的时间&#xff0c;瞬移魔法弹难度较低&#xff0c;黑洞魔法可能我的理解有误导致消耗时间较长&#xff0c;我会在下面把踩的坑写出来。 加上这个作业&#xff0c;我们一共做了三个魔法子弹了。同时那个老师也说我们可以写一个父类…

js中各种运算符

文章目录 扩展运算符&#xff1a;...逻辑运算符&#xff08;&& 或 || &#xff09;第一、&& (逻辑与)运算&#xff0c;看一个简单的例子&#xff1a;第二、|| (逻辑或)运算&#xff0c;看一个简单的例子&#xff1a;三、&& (逻辑与) 和||&#xff08;逻…

JMX vs JFR:谁才是最强大的JVM监控利器?

大家好&#xff0c;我是小米&#xff01;今天我们来聊一聊JVM监控系统&#xff0c;特别是关于JMX和JFR的使用。你是否有过在线上应用出现性能问题时&#xff0c;无法准确获取关键指标的困扰呢&#xff1f;那么&#xff0c;不妨听听我给大家带来的解决方案。 什么是JMX 首先&a…

什么是CTF?打CTF的意义是什么?(附网络安全入门教程)

什么是CTF? CTF在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。它起源于1996年DEFCON全球黑客大会&#xff0c;以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今&#xff0c;已经成为全球范围网络安全圈流行的竞赛形式&#xff0…

使用mkdocs快速部署上线静态站点到Github

背景 mkdocs是一种方便地生成站点的工具&#xff0c;相比hugo、hexo等个人博客而言&#xff0c;mkdocs更加简便、轻量级&#xff0c;可以快速帮助部署上线类似个人技术本&#xff08;notebook&#xff0c;wiki&#xff09;之类的站点。并且支持默认支持站点内搜索&#xff0c;…

网络安全自学路线

很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习&#xff0c;最终也只是会无疾而终&#xff01;黑客是一个大的概念&#xff0c;里面包含了许多方向&#xff0c;不同的方向需要学习的内容也不一样。 算上从学校开始学习&#xff0c;已经在网安这条路上走…

基于ensp的mpls vpn跨域optionA方案(分公司之间不能互访但是能访问总部场景)

目录 一 实验拓扑 二 实验要求 三 实验分析 四 实验配置说明 4.1完成正常ip地址配置&#xff0c;ISP内部使用ospf协议和mpls ldp协议 4.2 PE和CE之间起ebgp邻居 4.3 PE和PE之间起mpbgp邻居 4.4 PE和CE、ASBR之间设置VRF来进行RT值的过滤&#xff0c;选择合适的RT值来完…

网络编程:TCP socket

文章目录 阅读前导 服务端定义日志框架成员属性服务端框架 初始化服务器创建套接字绑定开启监听 运行服务器netstat 工具获取连接和通信准备通信逻辑 单进程服务端函数&#xff08;version1&#xff09;telent 工具测试 多进程服务端&#xff08;version2&#xff09;创建子进程…

手把手教你学习IEC104协议和编程实现 十四-文件操作之目录操作

文件服务也算是最后一个系统的大章节了。早期的IEC104软件仅实现了基本的通讯,也就是我们常说的3遥,对于定值和文件的操作都很少提及。 首先我们先要看看文件都包含那些。 文件包含的内容 故障录波文件 故障录波文件我们单独开一章来讲解。包含通讯及文件的格式 历史数据…

多核系统内存假共享问题

多核处理器&#xff08;SMP&#xff09;系统中&#xff0c; 每一个处理器都有一个本地高速缓存。内存系统必须保证高速缓存的一致性。当不同处理器上的线程修改驻留再同一高速缓存中的变量时就会发生假共享(false sharing)&#xff0c;结果导致高速缓存无效&#xff0c;并强制更…

长期封闭环境中与积极情绪相关的肠道菌群

谷禾健康 近年来&#xff0c;随着微生物群-肠-脑轴研究的深入&#xff0c;越来越多证据表明&#xff0c;微生物群-肠-脑轴在调节大脑功能方面发挥着关键作用&#xff0c;尤其是在情绪处理和行为方面。然而&#xff0c;肠道微生物群与长期封闭环境中的心理变化之间的相关性仍知之…

小魔推助力实体行业短视频创作,打爆UGC素人流量!

最近不止一次的和大家讲到UGC的玩法&#xff0c;相信很多朋友也有了一定的认知&#xff0c;UGC简单来说&#xff0c;就是通过用户来生产原创内容&#xff0c;通过实体店的门头、环境、特色服务等相关内容&#xff0c;并且带有门店地址发布&#xff0c;就可以提升实体商家的POI热…

tensorrt

【TensorRT】动态batch进行推理_tensorrt 动态batch_there2belief的博客-CSDN博客 https://www.cnblogs.com/harrymore/p/15387117.html 1.动态batch 2.tensor内存管理 3.

《河北教育》期刊简介及投稿邮箱

《河北教育》期刊简介及投稿邮箱 主管单位:河北省教育厅 主办单位:河北省教育宣传中心 国际刊号ISSN&#xff1a;1004-6208&#xff1b;国内刊号CN&#xff1a;13-1036/G4&#xff1b;邮发代号&#xff1a;18-67 出版周期&#xff1a;月刊 出版地&#xff1a;河北省石家庄…

pytorch中backward()函数与gradient 参数详解

矩阵乘法的例子1 以下例来说明backward中参数gradient的作用 注意在本文中表示矩阵乘法&#xff0c;*表示对应元素相乘 求A求偏导 试运行代码1 import torch# [1,2][2*3][1,3] A torch.tensor([[1., 2.]], requires_gradTrue) B torch.tensor([[10., 20., 30.], [100., 20…

『赠书活动 | 第五期』《人工智能数学基础》

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 『赠书活动 &#xff5c; 第五期』 本期书籍&#xff1a;《人工智能数学基础》 赠书规则&#xff1a;评论区&#xff1a;点赞&#xff5c;收藏&#xff5c;留言 评论…

DAP-seq技术鉴定葡萄MADS-box转录因子VvMADS28的靶基因,揭示葡萄胚珠发育的调控机制

葡萄是一种营养丰富、美味可口的水果&#xff0c;深受世界各地消费者的喜爱。近年来&#xff0c;无籽葡萄也越来越受大家的欢迎&#xff0c;因此&#xff0c;无籽葡萄品种的培育成为一个重要的育种目标&#xff0c;而了解葡萄种子发育的分子遗传调控机制对于无籽栽培品种的培育…

Kyligence Zen 产品体验-好用的指标平台

文章目录 一、Kyligence Zen概念一、BI发展历史1.以报表为核心的IT响应式服务2.以宽表为核心的自助可视化分析3.以指标为核心的可视化分析、增强分析 二、什么是Kyligence Zen&#xff1f;1.官网的介绍2.个人的理解 二、产品体验一、创建账号二、指标1.直接创建指标2.导入指标数…

postgresql集群编译安装

postgreSQL集群部署1环境准备&#xff08;三台服务器全部执行&#xff09; 2.1.1 准备三台虚拟机 服务器名称 服务器IP 描述 Pgsql-0 xxx.xxx.xxx.xxx master节点 Pgsql-1 xxx.xxx.xxx.xxx slave1节点 Pgsql-2 xxx.xxx.xxx.xxx slave2节点 2.1.2 安装编译需要的相…