字节码层面深入分析Java枚举类

java基本类型与byte数组互相转换 立即下载

Python微信订餐小程序课程视频

https://edu.youkuaiyun.com/course/detail/36074

Python实战量化交易理财系统

https://edu.youkuaiyun.com/course/detail/35475

枚举类的使用

定义一个简单的枚举类,其中包含若干枚举常量,示例如下:



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


Java 的 switch 语句参数支持使用枚举类



|  | // day是Day类型变量 |
|  | switch (day) { |
|  | case MONDAY: |
|  |  System.out.println("要开组会了好难受"); |
|  | break; |
|  | case THURSDAY: |
|  |  System.out.println("肯德基疯狂星期四"); |
|  | break; |
|  | case SATURDAY: case SUNDAY: |
|  |  System.out.println("不浪对不起周末"); |
|  | break; |
|  | default: |
|  |  System.out.println("摸摸鱼"); |
|  | break; |
|  | } |


其实这个用 static final 也可以,但是用枚举类的好处在于:

  • 用 static final 的话,传入的变量就需要进行参数检查,而枚举类不用,因为肯定在枚举的范围中,或为 null
  • static final 不支持属性扩展,每个变量名对应一个值,而每一个枚举值可以拥有自己的多个属性(字段)

枚举类可以添加属性及相应的构造器,以及方法,不过枚举类中的构造器默认也必须是 private 的。示例如下:



|  | public enum Day { |
|  |  MONDAY(1, "星期一"), |
|  |  TUESDAY(2, "星期二"), |
|  | // ...... |
|  |  SUNDAY(7, "星期日"); |
|  |  |
|  | private int index; |
|  | private String name; |
|  |  |
|  |  Day(int index, String name) { |
|  | this.index = index; |
|  | this.name = name; |
|  |  } |
|  |  |
|  | // 针对index、name的getter方法 |
|  | // ...... |
|  | } |


一般来说,不会为枚举类添加 setter 方法,因为这样会枚举一般只用来做常量,setter 会破坏它的常量特性

枚举类中的每个枚举常量都可以实现枚举主类定义的(abstract)方法,也可以拥有各自的内部方法,如下:



|  | public enum Day { |
|  |  MONDAY(1, "星期一"){ |
|  | @Override |
|  | public Day getNext() { |
|  | return TUESDAY; |
|  |  } |
|  |  }, |
|  |  TUESDAY(2, "星期二"){ |
|  | @Override |
|  | public Day getNext() { |
|  | return WEDNESDAY; |
|  |  } |
|  |  }, |
|  | // ...... |
|  |  SUNDAY(7, "星期日"){ |
|  | @Override |
|  | public Day getNext() { |
|  | return MONDAY; |
|  |  } |
|  |  }; |
|  |  |
|  | private int index; |
|  | private String name; |
|  |  |
|  |  Day(int index, String name) { |
|  | this.index = index; |
|  | this.name = name; |
|  |  } |
|  |  |
|  | // 在主类中定义抽象方法 |
|  | public abstract Day getNext(); |
|  |  |
|  | // 针对index、name的getter方法 |
|  | // ...... |
|  | } |


虽然也可以在每个枚举常量中自定义任何方法,但是如果没有在主类中声明,就不能访问到,这个暂且按下不表,原因在后面会解释

所有枚举类都默认继承了 Enum 类,可以直接使用 Enum 提供的实用方法。由于 Java 只支持单继承,所以枚举类不能再继承别的父类,只能实现接口。一些使用的 Enum 类的方法,都贴在了文末_

枚举类的枚举常量全局唯一,不存在并发安全性问题,且不会被反射、序列化方式恶意创建新的枚举常量对象,很适合用来实现单例模式。这里可以参加博主的另一篇文章:单例模式的各种实现方式(Java)

最后再补充一点,博主发现某书和很多博客都说:在比较两个枚举类型的值时 , 永远不需要调用 equals 方法, 而直接使用 == 就可以了。但是我看了下 Enum 类中给到的 equals 源码(贴在下面),实际上用的也是 ==,我自己手动测试了也没问题。但不知道为什么,大家的博客上都这么写的,难道真就是人云亦云吗-_-||



|  | public final boolean equals(Object other) { |
|  | return this==other; |
|  | } |


作者:酒冽        出处:https://blog.youkuaiyun.com/frankiedyz/p/15851123.html
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

枚举类底层原理探究

研究一个问题,最好是从现象出发去看本质,先知道有哪些现象,再看看它们的本质原因是什么。对于枚举类来说,它和普通类的不同之处就是现象:

  • 枚举类不能由外界创建对象
  • 枚举类默认继承了 Enum 类,不可以再继承其他类,且枚举类不可以被继承
  • 虽然 Enum 类中并没有 values() 和 valueOf(String) 方法,但是枚举类也可以调用
  • 枚举主类可以定义 abstract 方法,每个枚举常量都可以分别对其提供实现,不过它们也可以自定义其他方法。但只有在枚举主类定义过的方法,才能通过枚举常量调用到,否则不能
  • 定义在每个枚举主类中的字段,在各个枚举常量中却是不同的
  • 枚举类的所有枚举常量都是一开始就创建好的,全局唯一、不可变且线程安全

先编写一段普通的枚举类作为示例,代码如下:



|  | public enum Color { |
|  |  red("红", 0) { |
|  | @Override |
|  | public void print() { |
|  |  System.out.println(getName() + ":" + getIndex()); |
|  |  } |
|  |  }, |
|  |  green("绿", 1) { |
|  | @Override |
|  | public void print() { |
|  |  System.out.println(getName() + " " + getIndex()); |
|  |  } |
|  |  }; |
|  |  |
|  | private String name; |
|  | private int index; |
|  |  |
|  |  Color() { |
|  |  } |
|  |  |
|  |  Color(String name, int index) { |
|  | this.name = name; |
|  | this.index = index; |
|  |  } |
|  |  |
|  | // 枚举主类中定义的抽象方法 |
|  | public abstract void print(); |
|  |  |
|  | // name、index的getterr方法 |
|  | } |


先对 Color.class 进行反编译(javap 不加参数 -v):



|  | Compiled from "Color.java" |
|  | public abstract class com.duyuzhou.enumTest.Color extends java.lang.Enum<com.duyuzhou.enumTest.Color> { |
|  | public static final com.duyuzhou.enumTest.Color red; |
|  | public static final com.duyuzhou.enumTest.Color green; |
|  | public static com.duyuzhou.enumTest.Color[] values(); |
|  | public static com.duyuzhou.enumTest.Color valueOf(java.lang.String); |
|  | public java.lang.String getName(); |
|  | public int getIndex(); |
|  | public abstract void print(); |
|  | public static void main(java.lang.String[]); |
|  |  com.duyuzhou.enumTest.Color(java.lang.String, int, java.lang.String, int, com.duyuzhou.enumTest.Color$1); |
|  | static {}; |
|  | } |


仔细分析,就可以得出以下结论:

  • 枚举类继承了 Enum 类,以及 Enum 类的各种方法。编译器为枚举类添加了 final 关键字,使得枚举类不能被其他类继承
  • 枚举类被编译器额外添加了两个 static 方法:values() 和 valueOf(String)
  • 枚举类会被编译成 abstract 类,因此枚举类可以定义抽象方法
  • 枚举类的构造器都被改为了 private,因此外界不可以使用枚举类创建对象
  • 所有枚举常量都会被编译成枚举主类的 static final 属性,那么在类加载的初始化阶段就会将所有枚举常量创建好,而且只会创建一次。final 也能保证枚举常量一旦被创建好后,对于所有线程都是可见的,不会存在线程安全问题

如果反编译加上 -v 参数,可以看到 Color 有两个静态内部类,分别是 Color$1 和 Color$2,对其中一个进行反编译(不加 -v):



|  | Compiled from "Color.java" |
|  | final class com.duyuzhou.enumTest.Color$1 extends com.duyuzhou.enumTest.Color { |
|  |  com.duyuzhou.enumTest.Color$1(java.lang.String, int, java.lang.String, int); |
|  | public void print(); |
|  | } |


其实每个静态内部类都对应了一个枚举常量,这些静态内部类都继承了枚举主类,所以枚举常量中可以实现主类中定义的 abstract 方法。而且,在枚举主类中,每个枚举常量都变成了一个枚举主类类型的字段,因此外界不可能调用一个枚举常量中私自定义但枚举主类中没定义的方法

此外,由于每个枚举常量都是不同枚举子类的一个对象,所以它们各自继承了父类定义的字段,且观察枚举常量的反编译结果会发现,编译器为每个枚举子类都添加了一个构造函数,所以枚举主类中定义的字段是在各个枚举常量中分开赋值的

至此,上面的所有“现象”,都通过反编译查看字节码的方式得到了解答,本质上是编译器帮我们做好了幕后工作,所以才有了这些代码中看不到却实际存在的规则。不过,还遗留了一个小问题——在 Color.class 中,为什么编译器会为 Color 的构造器额外添加两个方法参数:String 和 int 型呢?

来看看 Color 的构造器 com.duyuzhou.enumTest.Color(java.lang.String, int, java.lang.String, int, com.duyuzhou.enumTest.Color$1) 反编译出的字节码:



|  | 0 aload\_0 |
|  | 1 aload\_1 |
|  | 2 iload\_2 |
|  | 3 aload\_3 |
|  | 4 invokespecial #2 Color. : (Ljava/lang/String;ILjava/lang/String;)V> |
|  | 7 return |


这里会调用 Color. 方法,该方法的字节码需要借助 Jclasslib 工具查看,如下:



|  | 0 aload\_0 |
|  | 1 aload\_1 |
|  | 2 iload\_2 |
|  | 3 invokespecial #9  : (Ljava/lang/String;I)V> |
|  | 6 return |


看到这里应该就能懂了,这里实际上会将额外添加的两个方法参数传递给父类 Enum 的构造器,那么看一下 Enum 中接收一个 String 和一个 int 型的构造器是怎样的:



|  | protected Enum(String name, int ordinal) { |
|  | this.name = name; |
|  | this.ordinal = ordinal; |
|  | } |


如果读者想进一步刨根问底,可以研究一下传递给 name 和 ordinal 的值是什么。这里先给出答案:因为调用构造函数创建的枚举常量,是由 static final 修饰的,所以调用的时机发生在类加载的初始化阶段,这时编译器会按顺序收集所有 static 赋值语句和 static 块,生成一个 方法,然后去执行这个方法。所以,name 和 ordinal 参数可以在该方法中分析字节码找到。name 实际上就是枚举常量名,ordinal 就是枚举常量在枚举类中声明的位置,从0开始计数。记录这两个参数是为了方便 Enum 中 toString、ordinal、compareTo 等方法的调用

能够看到这里,想必也就明白了枚举类这个 JDK5 才加入的新特性,就是一颗“语法糖”罢了。为了保持向后兼容性,Java 编译器做了很多幕后工作。根据这样的思路,我们也可以探究一下其他 Java 语法糖是如何实现的,比如 forEach 方法、自动装箱/拆箱、泛型为什么会擦除类型等

最后总结一下比较实用的 Enum 类提供的方法,和编译器为每个枚举类自动添加的两个方法(values() 和 valueOf(String))

Enum 类提供的方法:

  • String name():等同于 toString()
  • int ordinal():返回枚举常量在枚举类中声明的位置,从0开始计数
  • String toString():返回枚举常量名
  • int compareTo(E other):比较两个枚举常量声明的位置谁更靠前,其实靠的就是比较 ordinal 的大小
  • static Enum valueOf(Class clz, String name):根据枚举类和枚举常量名,返回特定的枚举常量

编译器为每个枚举类自动添加的方法:

  • Enum[] values():返回枚举常量数组,实际上编译器在 中创建各个枚举常量时,也会创建一个字段 $VALUES,其中就保存了这个数组
  • Enum valueOf(String name):根据枚举常量名,返回该枚举类中特定的枚举常量,内部调用的就是 Enum 的 valueOf 方法
未来智能家居解决方案:AI应用架构师的前沿探索 当你加班到深夜回家时,门锁自动识别你的脚步声解锁,玄关灯渐亮成你最爱的暖光,空调早已调到25℃(你夏天的习惯温度),音箱播放着最近循环的爵士乐,茶几上的智能水壶烧好了温水——这不是科幻电影,而是未来智能家居的日常。如何让“冰冷的设备”变成“懂你的伙伴”。我们将深入探讨五大前沿技术(边缘AI、多模态融合、联邦学习、数字孪生、个性化推荐)的底层原理,用“家里的小管家”“邻居互相学习”等生活化比喻简化复杂概念,结合代码示例与架构图还原实现流程,并通过智能卧室、智能厨房等真实案例展示落地路径。 阅读详情

相关推荐

保姆级教程如何进行本地局域网布署openclaw小龙虾

全网唯一一篇一步步实战教程,图文并茂方式的方式教你如何本地部署安装小龙虾openclaw

zzw17wei的专栏 1469

【语言篇】Java枚举类,字节码层面的深入浅出

Java语言篇Java枚举类枚举类的作用枚举类的工程实践枚举类字节码分析 Java枚举类 关于Java枚举类的博文有很多,但是很多都是说怎么去用枚举,少有全面地把枚举类给将清楚的。本文将从枚举类的作用说起,到个人对枚举类的一些工程实践,然后从字节码去剖析枚举类的本质,介绍枚举类name和ordinal,EnumSet和EnumMap枚举集合类为何物,最后涉及枚举在单例模式和职责链模式中的应用。 (...

grandachn的博客 2138

嵌入式开发中SAR与ΔΣ ADC选型指南:从原理到实战应用

模数转换器是嵌入式系统连接模拟世界与数字世界的核心接口,其选型直接决定了数据采集的精度与可靠性。SAR ADC采用逐次逼近原理,如同天平称重,通过二进制搜索快速完成转换,具备高速、多通道轮询的优势,适合电机控制、通信等动态场景。ΔΣ ADC则基于过采样与噪声整形技术,以速度换取精度,通过数字滤波输出高分辨率结果,在传感器测量、音频采集等静态高精度领域表现卓越。理解这两种架构的工作原理差异,是进行嵌入式ADC选型的基础。在实际工程中,需结合信号带宽、多通道切换需求、功耗约束及PCB布局能力进行综合权衡。例如,

weixin_30140399的博客 246

java数据类型 枚举_枚举(enum)属于原始数据类型(primitive typ

在Java中,变量有两种类型,一种是原始类型,一种是引用类型。原始类型一共有8种,它们分别是char,boolean,byte,short,int,long,float,double。在Java API中,有它们对应的包装类,分别是(首字母大写)Character,Boolean,Byte,Short,Integer,Long,Float,Double(char,int的变化稍微大点)。JAVA ...

weixin_34255938的博客 1267

手把手教你用TL431设计反激电源补偿器(附波特图调试技巧)

本文详细介绍了如何使用TL431设计反激电源补偿器,并提供了波特图调试技巧。通过实战经验分享,帮助工程师快速掌握补偿网络设计、分压电阻计算和稳定性判据,避免常见设计误区,提升电源稳定性与效率。

weixin_29201859的博客 379

告别PS串口焦虑:深入解析AXI Uartlite IP核如何将ZYNQ PL任意引脚变成串口(从Vivado约束到驱动文件全解析)

本文深入解析AXI Uartlite IP核如何将ZYNQ PL任意引脚变成串口,从Vivado约束到驱动文件全解析。通过AXI Uartlite IP核,开发者可以突破PS端UART数量限制,实现高效串口通信。文章详细介绍了IP核架构、Vivado工程配置、驱动开发及调试技巧,帮助开发者快速掌握这一技术。

weixin_33736649的博客 469

java中枚举器怎么用,java枚举使用怎么配置?java枚举是什么?

小伙伴们知道枚举吗?这是java中的一个小功能,因为很少使用到所以不常见,今天我们就来聊聊枚举是什么以及枚举的使用吧。枚举是什么?一般的说,枚举是一种特殊数据类型,说它特殊是因为,它既是类型却又比类型多了一些特殊约束,这些约束的存在造就了枚举的简洁,安全性以及便捷性。java中定义枚举需要使用enum关键字,隐含了所创建的类型都是java.lang.Enum类的子类(java.lang.Enum是...

weixin_34439450的博客 457

知识图谱_知识图谱 | 知识图谱做用户画像

导读:最近一直在思考怎么用知识图谱做推荐,但是目前能知道的内容都是基于路径的推荐和基于图特征的推荐,所以能不能换一个角度,探究一下用知识图谱怎么做用户画像,因为画像也是推荐系统重要的一部分。现在的知识图谱+推荐怎么做的传统的用户画像怎么做现在的知识图谱+推荐怎么做的?基于路径:可以理解成基于图谱的多路径召回,或者多路径推荐,然后根据路径的转移概率进行排序从而达到推荐的效果,基于路径比较适合简单的推...

weixin_28801659的博客 1461

java byte 枚举_java – 为什么在枚举类中禁止默认序列化

参见英文答案 > Is custom enum Serializable too?3个我一直在搜索web以查找与java中的枚举类相关的一些查询的答案.我的查询是为什么在枚举类中阻止了默认的反序列化.我可以看到enum类实现了Serializable接口,但它也有2个方法如下 –private void readObje...

weixin_39901332的博客 632

PySpark机器学习生产化陷阱:跨节点依赖问题的7种解决方案

隐式依赖陷阱使用ldd解决方案:在基础镜像中预装和路径冲突终极解法依赖树瘦身技巧用conda-tree可减少40%环境体积PySpark机器学习生产化的核心矛盾在于分布式环境的确定性与灵活性不可兼得。轻量级方案(1-3)牺牲一致性换取灵活性重量级方案(4-6)牺牲灵活性换取确定性混合方案(7)针对特殊场景补充正如某AI平台架构师所言:“环境一致性不是技术问题,而是工程纪律问题选择适合团队当前阶段的方案,建立严格的依赖管理流程,才能让PySpark真正扛起生产环境的大旗。

datacanvas2426的博客 911

YOLOv11涨点改进 | Conv篇/小目标改进 | YOLOv11引入SPDConv卷积特征无损下采样模块,增加YOLOv11小目标P2检测层(助力小目标任务高效涨点)

本文提出了一种创新的SPDConv模块来优化YOLOv11模型,通过空间到深度(SPD)层和非步幅卷积层实现特征无损下采样。该方法有效解决了传统CNN中因跨步卷积和池化层导致的细粒度信息丢失问题,特别提升了小目标检测性能。实验表明,SPDConv在目标检测和图像分类任务中显著优于现有SOTA模型。文章详细介绍了模块原理、核心代码实现,并提供了YOLOv11集成SPDConv的具体方法,包括配置文件修改和P2层增强等优化技巧。该技术为计算机视觉任务提供了一种高效的特征保留方案。

Ai缝合怪、助力小伙伴高效发论文 588

Java--枚举类型

enum。

qq_40132294的博客 308

Vibe Coding 实战指南:用 3 类社区资源实现每周高效追新

介绍一种分层技术雷达校准方法,通过领域过滤器(L1技术栈锚定、L2能力映射、L3场景收敛)精准筛选AI编程相关更新,结合可验证的Shell命令与CI任务卡,将信息过载压缩为可执行、可审计的工程实践。

weixin_27251469的博客 331

字节码层面理解枚举类Enum在switch中的使用

1.本文从字节码层面来探究,switch的case变量值为java枚举Enum时,编译器究竟做了什么工作。 2.源码如下 枚举类Color public enum Color { RED,BLUE,YELLOW } switch中使用Color public class MySwitchTest { int chooseColor(Color c){ ...

没有格子衬衫的程序员 1293

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java——枚举类

enum Day {MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY // 这里如果只是定义这些枚举常量的话,则这里不需要分号,// 如果后面还有其他成员,则需要分号实际上枚举类的构造器默认是私有的,如果你自己定义了一个构造器,没有加访问修饰符的话,就是默认 private 的。SPRING("温暖"),SUMMER("炎热"),AUTUMN("凉爽"),WINTER("寒冷");

Stewie Lee的博客 5878

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

通过字节码深入分析java的枚举类型enum

1.      Java中的枚举究竟是什么鬼? 如果从C++转java的话,会发现一个现象那就是在java中的枚举跟C++区别非常大,甚至可以说除了名字一样外,其他实现等都是非常不同的,在C++枚举更像个常数,而java的枚举更靠近正常的普通成员内部类。让我们从字节码角度看看java中的enum究竟是什么东西吧 源码:     public enum book{         BOO

qq838642798的博客 821

Java枚举类的本质

在idea中使用jclasslib字节码反编译插件分析枚举类的字节码文件 如下所示的一个枚举类: public enum ColorEnum { BLACK("黑色"), RED("红色"), WHITE("白色"), GREEN("绿色"); private final String color; ColorEnum(String color) { this.color = color; } public void desc() {

weixin_44503709的博客 778

【JAVA】枚举类到底是什么?(上)

枚举入门 说句很丢人的话,学了几年java,我对于枚举类还是非常不了解,了解之后才发现枚举用处非常之大。我们通过一个简单的例子,了解枚举的前世今生。 在java没有枚举类的时候,我们可以创建一个普通类来表示性别。 // 1.普通类 class SexEnum{ private String s; private SexEnum(String s){ this.s = s; } } // 使用:new SexEnum("男")、new SexEnum("女")

Will Of Coding 847

字节码层面理解java枚举Enum

1.自定义一个枚举类型Color.java public enum Color { RED,BLUE,YELLOW } 2.javac编译Color.java,生成Color.class。javac的时候记得添加-g选项才会生成局部变量表。 javac -g Color.java 3.javap反编译Color.class,重定向到Color.txt -v 输出详细信息 -...

没有格子衬衫的程序员 1932

java枚举类与成员变量的关系_深入理解枚举类

深入理解枚举最近刚学习完JVM相关知识,想到枚举既然这么异类,那就从字节码角度来分析一下它。有关枚举的讲解,很多博客已经很详细了,这里我们就从字节码的角度重新来认识一下它。枚举类是一种特殊的类,它可以有自己的成员变量,方法,可以实现一个或多个接口,也可也定义自己的构造器。1. 枚举类的继承结构:2. 枚举类和普通类的区别:(1)枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了jav...

weixin_33691489的博客 2648

【Java】深入剖析Java枚举类

枚举类是Java 5引入的,在Java 5之前,Java并没有内置的枚举类型,只能通过自定义类来实现类似枚举的功能。...Java 枚举类是一种特殊类型的数据结构,一般用来存储定义一些字符串,数字等数据结构。枚举类中的每个常量都称为枚举常量。枚举类在Java中使用关键字enum定义。CONSTANT1,CONSTANT2,CONSTANT3,...其中,EnumClass为枚举类的名称,CONSTANT1、CONSTANT2、CONSTANT3等为枚举常量的名称。

锥栗的博客 1721

反编译详解Java枚举类Enum

从字节码指令分析Java枚举类的运行过程。 目录 一、创建的枚举类 二、反编译字节码 1)getCode()方法分析 2)setCode()方法分析 三、枚举常量给枚举类成员变量赋值过程分析 一、创建的枚举类 public enum ResponseCodeEnum { SUCCESS("0000", "success"), BUSINESS_EXCEPTION("5000", "wrong"); private String code; private

小小史莱姆的博客 1107

深度解析 Java 枚举类的实现原理

本文深入解析了 Java 枚举类的实现原理和应用场景。枚举本质是继承自 java.lang.Enum 的 final 类,编译后会转换为普通类,枚举常量作为 public static final 字段在静态代码块中初始化。文章详细介绍了枚举的底层实现、核心方法、反射机制,并列举了状态管理、单例模式等典型应用场景。最后提供了常见面试题清单,涵盖枚举原理、应用实践和底层细节,帮助开发者全面理解枚举特性。

weixin_43829708的博客 1025

Java 枚举类 浅析

enum

m0_61654277的博客 474

java枚举类

应用场景 枚举用来表示一类值域范围有限的值,比如状态、性别等。java枚举值可以把每个值实例化成一个对象,为每个对象指定多个属性,方便维护管理。 优点: 按值实例化,每个实例可以指定多个属性以及实现抽象方法,方便维护和扩展 安全,java枚举类使用final修饰,不能被继承,实例均为static final修饰,构造器只能为私有,且在jvm层面限制不能被反射获取,天生有利于构造单例对象 使用注意点 1、java枚举类均继承自java.lang.Enum,故无法继承其他类,但可以实现多个接口 2、所有实例

思草 722

java枚举类型的实现原理

Java从JDK1.5开始支持枚举,也就是说,Java一开始是不支持枚举的,就像泛型一样,都是JDK1.5才加入的新特性。通常一个特性如果在一开始没有提供,在语言发展后期才添加,会遇到一个问题,就是向后兼容性的问题。像Java在1.5中引入的很多特性,为了向后兼容,编译器会帮我们写的源代码做很多事情,比如泛型为什么会擦除类型,为什么会生成桥接方法,foreach迭代,自动装箱/拆箱等,这有个术语叫

痴人说梦 2万+

Java枚举类从入门到精通

Java枚举是JDK1.5引入的特性,用于定义固定数量的类实例。枚举类通过enum关键字定义,本质上是final类且继承java.lang.Enum。其特点包括:1)对象数量固定(如性别类只需MALE/FEMALE两个实例);2)枚举元素本质是static final对象;3)提供私有构造器防止外部实例化。枚举类可包含构造方法、数据成员和成员方法,甚至支持抽象方法(需每个枚举元素实现)。实际开发中最常用基本定义方式,偶尔会添加属性和方法。枚举类编译后会生成继承Enum的final类,并提供name()和or

m0_73073987的博客 1158
上一篇: 云原生新时代弄潮儿k8s凭什么在容器化方面独树一帜?
下一篇: PyTorch 介绍 | DATSETS & DATALOADERS
pythonxxoo
博客等级 码龄5年 337粉丝 670原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值