Java——枚举

1. 概念

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

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

但是常量举例有不好的地方,例如:碰巧有个数字1,编译器可能误解为RED,现在我们可以直接用枚举来进行组织,这样一来,就拥有了类型,而不是普通的整型1

public enum TestEnum {RED,BLACK,GREEN;
}

优点:将常量组织起来统一管理

场景:错误状态码,消息类型,颜色的划分,状态机等等。。。

本质:是 java.lang.Enum 的子类,也就是说,自己写的枚举类型,就算没有显式继承Enum,但其默认继承了这个类

2. 使用

2.1 switch语句

示例:

public enum TestEnum {//枚举对象RED,BLACK,GREEN,WHITE;public static void main(String[] args) {TestEnum testEnum = RED;switch(testEnum) {case BLACK:System.out.println("BLACK");break;case RED:System.out.println("RED");break;case GREEN:System.out.println("GREEN");break;default:System.out.println("颜色错误");break;}}
}

2.2 常用方法

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

示例:

public enum TestEnum {//枚举对象RED,BLACK,GREEN,WHITE;public static void main(String[] args) {//values() 以数组形式返回枚举类型的所有成员TestEnum[] testEnums = TestEnum.values();for (int i = 0; i < testEnums.length; i++) {System.out.println(testEnums[i]);}System.out.println("============");//ordinal() 获取枚举成员的索引位置for (int i = 0; i < testEnums.length; i++) {System.out.println(testEnums[i].ordinal());}System.out.println("============");//valueOf()  将普通字符串转换为枚举实例TestEnum val = TestEnum.valueOf("RED");//TestEnum val = TestEnum.valueOf("RED2");//error,该字符串必须在枚举对象中有对应的System.out.println(val);System.out.println("============");//compareTo() 比较两个枚举成员在定义时的顺序//因为枚举默认继承于Enum,Enum实现了Comparable接口,所以可以compareToSystem.out.println(BLACK.compareTo(GREEN));}
}

运行结果:

查看Enum源码可以发现,该类只有一个构造方法,且是私有的,所以我们可以如下定义使用枚举:

public enum TestEnum {//枚举对象RED(1,"红色"),BLACK(2,"黑色"),GREEN(3,"绿色"),WHITE(4,"白色");public String color;public int ordinal;private TestEnum(int ordinal,String color) {this.color = color;this.ordinal = ordinal;}
}

3. 枚举优点缺点

优点:

  • 枚举常量更简单安全
  • 枚举有内置方法,代码更优雅

缺点:

  • 不可继承,无法扩展

4. 枚举与反射

枚举通过反射来拿实例化对象可行否?

在反射中,任何一个类,哪怕其构造方法是私有的,我们也可以通过反射拿到它的实例对象,下面用反射来拿枚举的实例对象:

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;public class Test {public static void main(String[] args) {Class<?> c1 = null;try {c1 = Class.forName("enumdemo.TestEnum");//这里传参不仅要传给自己重写的构造方法,还需要传参给父类的构造方法Constructor<?> constructor = c1.getDeclaredConstructor(String.class,int.class,int.class,String.class);constructor.setAccessible(true);TestEnum testEnum = (TestEnum)constructor.newInstance("haha",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);}}
}

运行结果:

我们查看报错的源码可以发现

 

 枚举在这里被过滤了,我们不能通过反射来获取枚举类的实例

该现象有关于面试题:为什么枚举实现单例模式是安全的

5. 面试问题

5.1 写一个单例模式

    public class Singleton {private volatile static Singleton uniqueInstance;private Singleton() {}public static Singleton getInstance() {if (uniqueInstance == null) {synchronized (Singleton.class){if(uniqueInstance == null){//进入区域后,再检查一次,如果仍是null,才创建实例uniqueInstance = new Singleton();}}}return uniqueInstance;}}

5.2 用静态内部类实现一个单例模式

    class Singleton {/** 私有化构造器 */private Singleton() {}/** 对外提供公共的访问方法 */public static Singleton getInstance() {return UserSingletonHolder.INSTANCE;}/** 写一个静态内部类,里面实例化外部类 */private static class UserSingletonHolder {private static final Singleton INSTANCE = new Singleton();}}public class Main {public static void main(String[] args) {Singleton u1 = Singleton.getInstance();Singleton u2 = Singleton.getInstance();System.out.println("两个实例是否相同:"+ (u1==u2));}}

5.3 用枚举实现一个单例模式

    public enum TestEnum {INSTANCE;public TestEnum getInstance(){return INSTANCE;}public static void main(String[] args) {TestEnum singleton1=TestEnum.INSTANCE;TestEnum singleton2=TestEnum.INSTANCE;System.out.println("两个实例是否相同:"+(singleton1==singleton2));}}

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

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

相关文章

意识与通用人工智能:北京智源大会深度解读

在科技迅猛发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;的意识问题成为了学术界和公众关注的焦点。北京智源大会汇聚了众多学者&#xff0c;围绕意识与通用人工智能&#xff08;AGI&#xff09;的关系进行了深入探讨。本文将对大会的精彩观点进行总结&#xff0c…

clickhouse join内存溢出

clickhouse join 内存溢出 前言排查步骤查看sql统计数据量统计大小优化索引优化字段增加内存最终优化 前言 在一个离线工作流中任务报错 Code: 241. DB::Exception: Received from XXXXXX:9000. DB::Exception: Memory limit (for query) exceeded: would use 20.49 GiB (att…

第 12 课:基于隐语的VisionTransformer框架

基于之前MPC的基础知识&#xff0c;本讲主要内容是MPCViT基于SecretFlow的VisionTransformer框架&#xff0c;主要从神经网络架构&#xff0c;隐私推理框架和实验结果三方面介绍。 一、MPCViT&#xff1a;安全且高效的MPC友好型 Vision Transformer架构 MPCViT隐私推理总体框架…

QT中子工程的创建,以及如何在含有库的子工程项目中引用主项目中的qt资源

1、背景 在qt中创建多项目类型,如下: CustomDll表示其中的一个动态库子项目; CustomLib表示其中的一个静态库子项目; MyWidget表示主项目窗口(main函数所在项目); 2、qrc资源的共享 如何在CustomDll和CustomLib等子项目中也同样使用 MyWidget项目中的qrc资源呢??? 直…

【AI应用探讨】—决策树应用场景

目录 1 命名实体识别&#xff08;NER&#xff09; 2 信用评估 3 医学诊断 4 垃圾邮件过滤 5 推荐系统 6 金融欺诈检测 7 医疗领域的其他应用 8 网络行为管理系统 1 命名实体识别&#xff08;NER&#xff09; 应用场景&#xff1a;在文本处理中&#xff0c;决策树可以用…

【项目实训】后端逻辑完善

经测试&#xff0c;我们决定前端可以同时选择多个类型的岗位进行查询&#xff0c;以显示相应的公司岗位信息 于是&#xff0c;修改后端函数的逻辑&#xff1a; 后端 首先&#xff0c;因为要对checkList中的job_name进行模糊匹配查询&#xff0c;于是使用以下代码&#xff1a…

mybatis批量处理

批量修改 <update id"updateTaskDistributions" parameterType"java.util.List"><foreach collection"viewTaskDistributions" index"index" item"item" open"begin" close";end;" separa…

【科学计算与可视化】3. Matplotlib 绘图基础

安装 pip install matplotlib 官方文档 https://matplotlib.org/stable/api/pyplot_summary.html 主要介绍一些图片绘制的简要使用&#xff0c;更加详细和进阶需要可参考 以上官方文档。 1 绘制基础 方法名说明title()设置图表的名称xlabel()设置 x 轴名称ylabel()设置 y 轴…

双指针:比较含退格的字符串

题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 代码看起来繁琐&#xff0c;但实际思想并不难。核心思路是&#xff1a;倒序遍历&#xff0c;遇到#就记录跳过次数&#xff0c;遇到字母就跳过记录次数&#xff0c;最后比较不用跳过时的字母是否一样。 class S…

负载组指南说明-负载柜

什么是负载组&#xff1f; 负载组是一种设备&#xff0c;旨在准确模拟电源在实际应用中看到的负载。这种负载组可以用电阻、电感或电容元件构建。它是一种电阻装置&#xff0c;以热量的形式消散一定量的能量&#xff0c;可以通过自然对流、强制空气或水冷系统去除。 为什么要使…

江协科技51单片机学习- p11 Proteus安装模拟51单片机

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记&#xff0c;在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用&#xff1a; Proteus快速入门&…

可溶性聚四氟乙烯离子交换柱PFA层析柱微柱一体成型

PFA微柱&#xff0c;也叫PFA层析柱、PFA离子交换柱等&#xff0c;主要用于地质同位素超净化、痕量、超痕量、微量元素分析实验室。 规格参考&#xff1a;1.5ml、15ml、30ml等。 其主要特性有&#xff1a; 1、PFA层析柱&#xff08;微柱&#xff09;专为离子交换设计&#xff…

SAP ERP公有云(全称 SAP S/4HANA Cloud Public Edition),赋能企业成为智能可持续的企业

在数字化浪潮中&#xff0c;每一家企业都需要应对快速的市场变化&#xff0c;不断追求降本增效&#xff0c;为创新提供资源&#xff0c;发展新的业务模式&#xff0c;安全无忧地完成关键任务系统的转型。 10年前&#xff0c;SAP进入云领域&#xff0c;用云ERP和覆盖全线业务的云…

双通道源表KEITHELY2636B详情参数吉时利2636B

Keithley的2636B是一款2600B系列双通道系统源表(SMU)仪器(0.1fA, 10A脉冲)。它是业界领先的电流/电压源和测量解决方案。这种双通道模型结合了精密电源&#xff0c;真电流源&#xff0c;6 1/2位DMM&#xff0c;任意波形发生器&#xff0c;脉冲发生器和电子负载的能力&#xff0…

锐起RDV5高性能云桌面

锐起是上海锐起信息技术有限公司旗下品牌。该公司创立于 2001 年&#xff0c;是桌面虚拟化产品和解决方案提供商&#xff0c;专注于桌面管理系统和私有云存储系统的系列软件产品研发&#xff0c;致力于简化 IT 管理、增强系统安全&#xff0c;提供简单、易用、稳定、安全的产品…

并发数据结构:ConcurrentHashMap深入分析

在Java并发编程中&#xff0c;ConcurrentHashMap是一个极其重要的类&#xff0c;它提供了比Hashtable和同步的HashMap更好的并发性能。本文将深入分析ConcurrentHashMap的内部结构、工作原理以及如何高效地使用它。 1. ConcurrentHashMap简介 ConcurrentHashMap是Java集合框架…

kubernetes Job yaml文件解析

一、yaml文件示例 apiVersion: batch/v1 kind: Job metadata:name: test-jobnamespace: mtactor spec:completions: 3parallelism: 1backoffLimit: 5activeDeadlineSeconds: 100template:spec:containers:- name: test-jobimage: centoscommand: ["echo","test…

linux创建逻辑盘再挂载

创建逻辑盘再挂载 原因&#xff1a;如果直接挂载整盘&#xff0c;后面想扩容会很麻烦。挂载逻辑卷的话就简单很多。为了以后方便。所以直接挂载逻辑卷 openEuler系统先装lvm2如果&#xff1a;-bash: pvcreate: command not found执行&#xff1a;yum install lvm2 df -hT ls…

我在高职教STM32——GPIO入门之按键输入(1)

大家好&#xff0c;我是老耿&#xff0c;高职青椒一枚&#xff0c;一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次&#xff0c;同行应该都懂的&#xff0c;老师在课堂上教学几乎是没什么成就感的。正因如此&#xff0c;才有了借助 CSDN 平台寻求认同感和成就…

Linux下创建虚拟磁盘

参考文档 https://blog.csdn.net/lujun9972/article/details/115762407 https://blog.csdn.net/Kiritow/article/details/118076034 1&#xff0c;创建挂载点 sudo mkdir /mnt/z //方式一&#xff0c;内存盘方式 2&#xff0c;创建内存盘 sudo mount -t ramfs -o size1G z /…