枚举到底是个什么鬼类型?

article/2025/2/6 8:02:30

前言

枚举是很多面向对象语言都会有的一种类型,它可以将表达同一类型的变量组合成一个集合,组成一个常量集

在Java中也有枚举类型,是用enum关键字来表示的

枚举常用来表示一个常量集,用来限定变量的取值,只能在枚举的范围内,比如一年四季只有春、夏、秋、冬、一个星期只有周一到周日,这类固定的常量就比较适合用枚举来表达

当然你说我用静态的常量来表达行不行呢?也是可以的,只是枚举就是为这种场景而生的

枚举这种类型其实没什么存在感,大家在使用的时候也是使用最基本的用法,甚至很多人都不用枚举,至少我自己在写这篇文章之前是很少用
枚举类型的,经常会用静态常量来代替枚举,但枚举确实有他的好处,下面我们就一起来看一下

枚举的简单用法

public enum OrderState {ORDER_CONFIRM,ORDER_PAYED,ORDER_DELIVERY,ORDER_FINISH
}

OrderState列举了订单的几种状态

  • ORDER_CONFIRM 订单已确认
  • ORDER_PAYED 订单已支付
  • ORDER_DELIVERY 订单已出库
  • ORDER_FINISH 订单已完成
OrderState orderState = OrderState.ORDER_FINISH;
System.out.println(orderState);

在使用枚举类型时,需要定义一个枚举类型的对象,如上代码,执行结果如下:

ORDER_FINISH

枚举类型常用的方法

  • values() 返回所有的枚举值数组
  • ordinal() 表示枚举值在枚举类型中的次序,从0开始
  • compareTo() 用于比较两个枚举类型
  • name() 返回枚举值
// values()返回所有的枚举值
for (OrderState os :OrderState.values()) {//枚举值的次序System.out.println(os + "|" + os.ordinal());//比较System.out.println(os.compareTo(OrderState.ORDER_FINISH));//枚举值System.out.println(os.name());System.out.println("------------------");
}

向枚举中添加方法

在枚举的简单用法中,枚举类里面只定义了几个常量,其实枚举类型中还可以增加方法

public enum OrderState {ORDER_CONFIRM(0,"订单已确认"),ORDER_PAYED(1,"订单已支付"),ORDER_DELIVERY(2,"订单已支付"),ORDER_FINISH(3,"订单已完成");private int state;private String stateText;OrderState(int state,String stateText){this.state = state;this.stateText = stateText;}public int getState(){return state;}public String getStateText(){return stateText;}public static void main(String[] args){for(OrderState orderState : OrderState.values()){System.out.println(orderState + "|" + orderState.getState() + "|" + orderState.getStateText());}}
}

从上面的代码可以看出来,枚举类型可以有构造方法,也可以有普通方法,枚举跟类很像,或者说它就是一种拥有限制的类

switch中的枚举

枚举跟switch语句简直是天造地设的一对,switch中可以天然的支持枚举类型

switch (orderState){case ORDER_CONFIRM:System.out.println(orderState.getState());break;case ORDER_PAYED:System.out.println(orderState.getStateText());break;case ORDER_DELIVERY:System.out.println(orderState.getState());break;case ORDER_FINISH:System.out.println(orderState.getStateText());break;
}

枚举的真面目

我们用编译/反编译的方法来看一下枚举到底是个什么鬼类型

首先编译OrderState.java文件,注意你的枚举类型中有中文需要加-encoding参数用UTF-8进行编码,否则会编译不通过

javac -encoding UTF-8 OrderState.java

执行完成后,在同一目录下会生成一个OrderState.class文件,我们反编译回来

javap -p OrderState.class

会得到如下的代码

//枚举就是一个继承自Enum的类
public final class org.kxg.enumDemo.OrderState extends java.lang.Enum<org.kxg.enumDemo.OrderState> {//枚举中的常量就是类的静态变量public static final org.kxg.enumDemo.OrderState ORDER_CONFIRM;public static final org.kxg.enumDemo.OrderState ORDER_PAYED;public static final org.kxg.enumDemo.OrderState ORDER_DELIVERY;public static final org.kxg.enumDemo.OrderState ORDER_FINISH;//私有变量变成类的私有变量private int state;private java.lang.String stateText;private static final org.kxg.enumDemo.OrderState[] $VALUES;//values()很有意思,它是编译器自动生成的public static org.kxg.enumDemo.OrderState[] values();public static org.kxg.enumDemo.OrderState valueOf(java.lang.String);//构造方法private org.kxg.enumDemo.OrderState(int, java.lang.String);public int getState();public java.lang.String getStateText();public static void main(java.lang.String[]);static {};
}

从反编译回来的内容,可以看出来,枚举类型本质是就是继承自Enum的final类,枚举中定义的常量就是类的静态常量

有一个很有意思的点就是,编译器会自动生成values()方法,因为在枚举本身和Enum类中都没有values()方法,只能是编译器在编译的时候自动生成的

枚举可以继承,可以实现接口吗?

枚举可以继承吗?可以实现接口吗?

面试官就喜欢问类似的问题,如果你对枚举不了解,肯定就答不上来了

从上面反编译的结果来看,枚举本质是个final类并且继承自Enum,Java里面不支持多继承,所以枚举不能继承其他类,同时枚举是个final类,也不能被继承

但枚举可以实现接口,枚举本质上就是个类,所以它有类的一般特性

定义一个接口

public interface Color {public String getColor();
}

定义一个枚举类型,实现Color接口

public enum EmnuInterface implements Color {RED("红色"),GREEN("绿色"),GRAY("灰色"),YELLOW("黄色");private String color;EmnuInterface(String color){this.color = color;}@Overridepublic String getColor() {return color;}public static void main(String[] args){EmnuInterface color = EmnuInterface.GREEN;System.out.println(color.getColor());}
}

输入结果:

绿色

枚举的优缺点

1、枚举常量简单安全

不使用枚举的时候,我们是这样定义常量的

public static final String RED = "红色";
public static final String GREEN = "绿色";
public static final String GRAY = "灰色";
public static final String YELLOW = "黄色";

这样使用看起来也没什么问题,可以达到常量的效果,但这个静态常量是不具有范围限定的,比如我有一个方法要限定只能传入指定的几个颜色,使用静态常量就无法限制范围,使用者可以随意传入静态常量,但如果使用了枚举就可以限定只能传入指定范围内的值

2、枚举有内置方法

如果要列出所有的常量,类和接口必须使用反射,比较繁琐,而枚举有内置的方法values()可以很方便的列举出静态常量

3、枚举的缺点

枚举不可继承,无法扩展,但枚举一般用来定义常量,也不需要扩展

如果感觉对你有些帮忙,请收藏好,你的关注和点赞是对我最大的鼓励!
如果想跟我一起学习,坚信技术改变世界,请关注【Java天堂】公众号,我会定期分享自己的学习成果,第一时间推送给您

在这里插入图片描述


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

相关文章

面试官:为啥需要枚举?枚举有什么作用?怎么用枚举实现单例?

点赞再看&#xff0c;养成习惯&#xff0c;微信搜索【三太子敖丙】关注这个互联网苟且偷生的工具人。 本文 GitHub https://github.com/JavaFamily 已收录&#xff0c;有一线大厂面试完整考点、资料以及我的系列文章。 Java基础&#xff1a;枚举的用法与原理 在学习过程中&…

了解什么是枚举(enumeration)

1、枚举是一组常量的集合。还可以看成包含有限特定的对象。 2、自定义枚举的步骤&#xff1a; 将构造器私有化private将get方法拿掉在类的内部直接创建固定的对象&#xff0c;比如&#xff1a;public static Season SPRING new Season("春天","温暖");使…

Java~枚举的使用

目录 枚举的定义 枚举的使用 values()的使用 ordinal()的使用 valueOf() 的使用 compareTo()的使用 枚举的优缺点 枚举的定义 枚举是JDK1.5以后引入的。主要用途&#xff1a;将一组常量组织起来&#xff0c;在引入枚举之前表示一组常量通常是使用定义常量的方式&…

枚举类的使用方法

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

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;色度学称之为“色彩的主观三属性”。 色彩…