枚举类的使用方法

article/2025/2/6 23:53:47

一、理解枚举类型

枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。下面先来看看如何写一个枚举?

二、枚举的定义语法

在没有枚举类型时定义常量常见的方式
    public class DayDemo {public static final int MONDAY =1;public static final int TUESDAY=2;public static final int WEDNESDAY=3;public static final int THURSDAY=4;public static final int FRIDAY=5;public static final int SATURDAY=6;public static final int SUNDAY=7;}

上述的常量定义常量的方式称为int枚举模式,这样的定义方式并没有什么错,但它存在许多不足,如在类型安全和使用方便性上并没有多少好处,如果存在定义int值相同的变量,容易混淆,因此这种方式在枚举出现后并不提倡,现在我们利用枚举类型来重新定义上述的常量,定义周一到周日的常量
//枚举类型,使用关键字enum

    enum Day {MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FRIDAY, SATURDAY, SUNDAY}

相当简洁,在定义枚举类型时我们使用的关键字是enum,与class关键字类似,只不过前者是定义枚举类型,后者是定义类类型。

枚举类型Day中分别定义了从周一到周日的值,这里要注意,值一般是大写的字母,多个值之间以逗号分隔。同时我们应该知道的是枚举类型可以像类(class)类型一样,定义为一个单独的文件,当然也可以定义在其他类内部,更重要的是枚举常量在类型安全性和便捷性都很有保证,如果出现类型问题编译器也会提示我们改进,但务必记住枚举表示的类型其取值是必须有限的,也就是说每个值都是可以枚举出来的,比如上述描述的一周共有七天。

以上是写法,写好后该如何使用呢?如下:

    public class EnumDemo {public static void main(String[] args){//直接引用Day day =Day.MONDAY;}}

就像上述代码那样,直接引用枚举的值即可,这便是枚举类型的最简单模型。

三、为什么可以这样用,看看枚举实现原理就知道了

我们大概了解了枚举类型的定义与简单使用后,现在有必要来了解一下枚举类型的基本实现原理。实际上在使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个相关的类,这个类继承了Java API中的java.lang.Enum类,也就是说通过关键字enum创建枚举类型在编译后事实上也是一个类类型而且该类继承自java.lang.Enum类。我们可以看看反编译的结果!

结论:从反编译的代码可以看出编译器确实帮助我们生成了一个Day类而且该类继承自java.lang.Enum类,该类是一个抽象类,除此之外,编译器还帮助我们生成了7个Day类型的实例对象分别对应枚举中定义的7个日期。还为我们生成了两个静态方法,分别是values()和 valueOf(),到此我们也就明白了,使用关键字enum定义的枚举类型,在编译期后,也将转换成为一个实实在在的类,而在该类中,会存在每个在枚举类型中定义好常量的对应实例对象,如上述的MONDAY枚举类型对应public static final Day MONDAY;

四、编译器生成的Values方法与ValueOf方法

values()方法和valueOf(String name)方法是编译器生成的static方法,后面我们自己定义的枚举类的父类Enum的分析中,在Enum类中并没出现values()方法,但valueOf()方法还是有出现的,只不过编译器生成的valueOf()方法需传递一个name参数,而Enum自带的静态方法valueOf()则需要传递两个方法,从前面反编译后的代码可以看出,编译器生成的valueOf方法最终还是调用了Enum类的valueOf方法,下面通过代码来演示这两个方法的作用:
    Day[] days2 = Day.values();System.out.println("day2:"+Arrays.toString(days2));Day day = Day.valueOf("MONDAY");System.out.println("day:"+day);

输出结果:

  day2:[MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]day:MONDAY

从结果可知道,values()方法的作用就是获取枚举类中的所有变量,并作为数组返回,而valueOf(String name)方法与Enum类中的valueOf方法的作用类似根据名称获取枚举变量,只不过编译器生成的valueOf方法更简洁些只需传递一个参数。

五、Enum抽象类常见方法

Enum是所有 Java 语言枚举类型的公共基本类(注意Enum是抽象类),以下是它的常见方法:

在这里插入图片描述

ordinal()方法,该方法获取的是枚举变量在枚举类中声明的顺序,下标从0开始,如日期中的MONDAY在第一个位置,那么MONDAY的ordinal值就是0,如果MONDAY的声明位置发生变化,那么ordinal方法获取到的值也随之变化,注意在大多数情况下我们都不应该首先使用该方法,毕竟它总是变幻莫测的。

compareTo(E o)方法则是比较枚举的大小,注意其内部实现是根据每个枚举的ordinal值大小进行比较的。

name()方法与toString()几乎是等同的,都是输出变量的字符串形式。

valueOf(Class enumType, String name)方法则是根据枚举类的Class对象和枚举名称获取枚举常量,注意该方法是静态的。

下面的代码演示了上述方法:

    public class EnumDemo {public static void main(String[] args){//创建枚举数组Day[] days=new Day[]{Day.MONDAY, Day.TUESDAY, Day.WEDNESDAY,Day.THURSDAY, Day.FRIDAY, Day.SATURDAY, Day.SUNDAY};for (int i = 0; i <days.length ; i++) {System.out.println("day["+i+"].ordinal():"+days[i].ordinal());}System.out.println("-------------------------------------");//通过compareTo方法比较,实际上其内部是通过ordinal()值比较的System.out.println("days[0].compareTo(days[1]):"+days[0].compareTo(days[1]));System.out.println("days[0].compareTo(days[1]):"+days[0].compareTo(days[2]));//获取该枚举对象的Class对象引用,当然也可以通过getClass方法Class<?> clazz = days[0].getDeclaringClass();System.out.println("clazz:"+clazz);System.out.println("-------------------------------------");//name()System.out.println("days[0].name():"+days[0].name());System.out.println("days[1].name():"+days[1].name());System.out.println("-------------------------------------");System.out.println("days[0].toString():"+days[0].toString());System.out.println("days[1].toString():"+days[1].toString());System.out.println("-------------------------------------");Day d=Enum.valueOf(Day.class,days[0].name());Day d2=Day.valueOf(Day.class,days[0].name());System.out.println("d:"+d);System.out.println("d2:"+d2);}

六、枚举的进阶用法

向enum类添加方法与自定义属性和构造函数 重新定义一个日期枚举类,带有desc成员变量描述该日期的对于中文描述,同时定义一个getDesc方法,返回中文描述内容,自定义私有构造函数,在声明枚举实例时传入对应的中文描述,代码如下:
    public enum Day2 {MONDAY("星期一",1),TUESDAY("星期二",2),WEDNESDAY("星期三",3),THURSDAY("星期四",4),FRIDAY("星期五",5),SATURDAY("星期六",6),SUNDAY("星期日",7);//记住要用分号结束private String desc;//文字描述private Integer code; //对应的代码/*** 私有构造,防止被外部调用* @param desc*/private Day2(String desc,Integer code){this.desc=desc;this.code=code;}/*** 定义方法,返回描述,跟常规类的定义没区别* @return*/public String getDesc(){return desc;}/*** 定义方法,返回代码,跟常规类的定义没区别* @return*/public int getCode(){return code;}public static void main(String[] args){for (Day2 day:Day2.values()) {System.out.println("name:"+day.name()+",desc:"+day.getDesc());}}

输出结果:

  name:MONDAY,desc:星期一name:TUESDAY,desc:星期二name:WEDNESDAY,desc:星期三name:THURSDAY,desc:星期四name:FRIDAY,desc:星期五name:SATURDAY,desc:星期六name:SUNDAY,desc:星期日

http://chatgpt.dhexx.cn/article/sEEkjaOu.shtml

相关文章

java枚举类详解

一、初始枚举 枚举类型是Java 5中新增特性的一部分&#xff0c;它是一种特殊的数据类型&#xff0c;之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束&#xff0c;但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。下面先来看看什么是枚举…

(JAVA): 自定义枚举和enum枚举类型------详解。

目录 言图&#xff1a; ☣☣一、基本介绍 ☣1、什么是枚举 ☣2、枚举的特点 ☣3、枚举的实现方式 ☣☣二、自定义类实现枚举 ☣1、自定义枚举的特点 ☣2、代码示例 ☣3、代码分析 ☣☣三、enum关键字实现枚举 ☣1、enum使用细节 ☣2、enum实现接口 ☣3、代码示例 …

色彩-基础理论

颜色三大指标 色相 色相是颜色的一个属性&#xff0c;只有黑白灰没有色相这个属性(那银灰色是什么&#xff1f;) 颜色的相貌&#xff0c;指的也是给颜色一个名字 例如&#xff1a;暗红、酒红、土黄、墨绿 饱和度 颜色的鲜艳程度 纯度 饱和度主要取决于含色成分和消色成分&a…

10bit、8bit色彩深度的区别

下面 一张图能说明区别&#xff0c;10bit能表现的颜色值范围更多

OpenCV色彩空间与通道

色彩空间与通道 色彩空间&#xff08;Color Space&#xff09;是指用来描述和表示图像颜色的一种方式。不同的色彩空间具有不同的颜色模型和表示方式&#xff0c;常见的色彩空间包括 RGB、CMYK、HSV、Lab 等。 通道&#xff08;Channel&#xff09;是指在某种色彩空间中独立表…

色彩空间(一):色彩空间基础

转载自&#xff1a;https://www.zhangxiaochun.com/color-space-1/ 序言 相信很多做设计的小伙伴都听说过 RGB 或者 CMYK 这样的概念&#xff0c;RGB 和 CMYK 就是两个典型的色彩空间模式&#xff0c;前者主要用于光学色彩展示&#xff08;比如我们的电脑显示屏&#xff09;&am…

【数字图像处理】色彩模型

作者介绍&#xff1a;小星的学习笔记&#xff0c;一名努力成为合格程序员的本科在读生 提示&#xff1a;本文仅为学习复习笔记&#xff0c;如有不对欢迎指正&#x1f389;&#x1f389;&#x1f389; 文章目录 前言 一、什么是色彩模型&#xff1f; 二、面向设备的色彩模型 …

色阶

Ps菜单&#xff1a;图层/新建调整图层/色阶 Layer/New Adjustment Layer/Levels Ps菜单&#xff1a;图像/调整/色阶 Image/Adjustments/Levels 快捷键&#xff1a;Ctrl/Cmd L 色阶 Levels命令可以调整图像的阴影、中间调和高光的强度级别&#xff0c;校正色调范围和色彩平衡。…

调色进阶工具的一些认识——色彩平衡

打开色彩平衡里面的内容&#xff0c;以及有哪些功能 我们打开CR里面也有阴影高光 阴影 高光 中间调什么概念呢&#xff0c;等于我们打开一张图片把这张图片分成了这三个部分。 阴影&#xff1a;在图指的是颜色偏暗的&#xff0c;那么根据这个颜色条红色部分同理可选颜色&a…

PS 色阶调整之算法公式原理详解及 Python 实现(色阶原理)

本文介绍了 PS 中色阶的实现原理及公式&#xff0c;并用 Python 实现&#xff0c;自测与 PS 的色阶调整效果基本完全一样&#xff08;使用和 PS 中色阶相同的参数对比效果&#xff0c;包括各极限值&#xff0c;本文只实现了 RGB 整体色阶的处理&#xff0c;对各个通道的处理逻辑…

第四章 Opencv图像色彩空间与通道

文章目录 1.色彩空间1-1.RGB/BGR色彩空间1-2.GRAY色彩空间1-3.HSV色彩空间 2.通道2-1.拆分通道&#xff1a;split()方法1.拆BGR色彩空间图像的通道2.拆HSV色彩空间图像的通道 2-2.合并通道&#xff1a;merge()方法1.B、G、R 通道的合并2.H、S、V 通道的合并3.B、G、R、A 通道的…

halcon画出灰度直方图_Halcon绘制彩色深度图

此小文主要介绍颜色空间的转换&#xff0c;将深度图转为彩色&#xff0c;借以说明颜色转换与图像通道&#xff0c;下面是效果&#xff1a; 彩色深度图.jpg 深度图的生成 深度图的生成有便捷的算子可用&#xff0c;主要使用了binocular_disparity算子&#xff0c;输入左右两幅图…

【色度学】颜色的显色系统

我的理解&#xff1a; 色相&#xff1a;绝对量&#xff0c;表示颜色。 视明度&#xff1a;人眼视觉对某一刺激量知觉光的数量的多少&#xff0c;是知觉的绝对量。 明度&#xff1a;人眼视觉对某一刺激量直觉出其与周围白点或者最亮区域的相对亮度。 明度 视明度/白场视明度 视彩…

四、色彩空间

一、色彩空间 1、什么是色彩空间&#xff1f; 色彩空间是定义的颜色范围。 2、常见的色彩空间有哪些&#xff1f; ①RGB ②HSV 在OpenCV中&#xff0c;Hue的值为0~180&#xff0c;之所以不是360是因为&#xff0c;8位存不下&#xff0c;故进行归一化操作&#xff0c;使得H…

色彩系统总结

一、基本概念 1、几种色彩模式&#xff1a;RGB、HSB(HSV)、HSL RGB&#xff08;Red 红色、Green 绿色、Blue 蓝色&#xff09; HSB&#xff08;Hue 色相、Saturation 饱和度、Brightness 明度&#xff09; HSB 也称 HSV&#xff08;Hue 色相、Saturation 饱和度、Value 值&…

色阶、灰度色彩模式、灰度等级

色彩三属性图解 色彩的客观三属性与主观三属性 在经典艺用色彩学中&#xff0c;我们只知道一种“色彩三属性”&#xff0c;实际上它只是对人们主观感受色彩的心理描述&#xff0c;建立在人的主观基础之上的对色彩属性的描述&#xff0c;色度学称之为“色彩的主观三属性”。 色彩…

图像的大小计算 位深和色深

图像的大小计算 1、位深和色深 位深&#xff1a;即在某一分辨率下&#xff0c;每一个像素点可以有多少种色彩来描述&#xff0c;单位为“bit”(位)。典型的色深是8-bit、16-bit、24-bit和32-bit。深度数值越高&#xff0c;可以获得更多的色彩。 图像深度是指存储每个像素所用的…

15.色彩空间

目录 一 色彩空间的粗略定义 二 色彩空间的分类 1.利用原色相混的比例表示的色彩空间 2.利用不同的概念表示的色彩空间 &#xff08;1&#xff09;.色相 &#xff08;2&#xff09;饱和度 &#xff08;3&#xff09;明度 &#xff08;4&#xff09;亮度 三 HSV和HSL色…

2.1 色彩空间

色彩发送器 色彩认知&#xff1a;光源是出生点&#xff0c;光源发射出光线&#xff0c;光线通过直射反射折射等路径最终进入人眼。但是人眼接收到光线后&#xff0c;人眼的细胞产生了一系列化学反应。由此把产生的新号传入大脑&#xff0c;最终大脑对颜色产生了认知感知。 光的…

色数(色深”、“灰阶”、“色数”三者的关系)

色数&#xff0c;就是显示器能够显示最大色彩数量。我们在选购显示器时&#xff0c;常常会发现产品资料并未提及色深相关信息&#xff0c;却能看到“1670万色”、“10亿色”之类关于色数的描述&#xff0c;而“10亿色彩”表示该显示器能显示约10亿种不同的颜色。 比如&#xf…