枚举 Myth丶恋晨 2022-04-23 08:34 307阅读 0赞 在第一次学习面向对象编程时,我记得最深的一句话就是“万物皆对象”。于是我一直秉承着这个思想努力的学习着JAVA,直到学习到枚举(Enum)时,看着它颇为奇怪的语法……我一直在想,这TM是个什么鬼???当时学习OOP时也是被类啊接口什么的整的有点昏头转向的于是就把这个小细节忽略掉了。后来到了公司工作后慢慢的又需要用上枚举了,看着它一副神秘兮兮的样子我还是决定要好好的深挖一下!以下链接是了解枚举时所参考的博客。如发现本文有错误或知识遗漏欢迎在评论中指正! [反编译那些事儿(二)—枚举的反编译][Link 1]:http://blog.csdn.net/gaohuanjie/article/details/18140279 JAVA枚举与常量类的区别:http://blog.csdn.net/tanqian351/article/details/53736628 ## 目录: ## -------------------- 1)历史 2)语法解析 3)枚举的好处以及与常量类的区别 4)枚举常用方法 ## 1.历史: ## -------------------- 枚举是JDK1.5版本新增的特性(泛型、For-each等如今被广泛应用的特性也是由JDK1.5时所新增的),另外到了JDK1.6后switch语句支持枚举类型。 ## 2.枚举的语法解析: ## -------------------- 1.最最最简单版 <table> <tbody> <tr> <td> <p>1</p> <p>2</p> <p>3</p> </td> <td> <p><code>public</code> <code>enum</code> <code>ColorEnum { </code></p> <p><code> </code><code>RED,BLUE,GREEN</code></p> <p><code>}</code></p> </td> </tr> </tbody> </table> 通过工具解析class后获得的源代码(工具参考上面的链接) ![复制代码][copycode.gif] public final class ColorEnum extends Enum { //返回存储枚举实例的数组的副本。values()方法通常用于foreach循环遍历枚举常量。 public static ColorEnum[] values() { return (ColorEnum[])$VALUES.clone(); } //根据实例名获取实例 public static ColorEnum valueOf(String s) { return (ColorEnum)Enum.valueOf(ColorEnum, s); } //私有构造方法,这里调用了父类的构造方法,其中参数s对应了常量名,参数i代表枚举的一个顺序(这个顺序与枚举的声明顺序对应,用于oridinal()方法返回顺序值) private ColorEnum(String s, int i) { super(s, i); } //我们定义的枚举在这里声明了三个 ColorEnum的常量对象引用,对象的实例化在static静态块中 public static final ColorEnum RED; public static final ColorEnum BLUE; public static final ColorEnum GREEN; //将所有枚举的实例存放在数组中 private static final ColorEnum $VALUES[]; static { RED = new ColorEnum("RED", 0); BLUE = new ColorEnum("BLUE", 1); GREEN = new ColorEnum("GREEN", 2); //将所有枚举的实例存放在数组中 $VALUES = (new ColorEnum[] { RED, BLUE, GREEN }); } } ![复制代码][copycode.gif] 2.现在我们在枚举类中增加自己的字段以及一些辅助方法,代码如下: ![复制代码][copycode.gif] public enum ColorEnum { RED("red","红色"),GREEN("green","绿色"),BLUE("blue","蓝色"); //防止字段值被修改,增加的字段也统一final表示常量 private final String key; private final String value; private ColorEnum(String key,String value){ this.key = key; this.value = value; } //根据key获取枚举 public static ColorEnum getEnumByKey(String key){ if(null == key){ return null; } for(ColorEnum temp:ColorEnum.values()){ if(temp.getKey().equals(key)){ return temp; } } return null; } public String getKey() { return key; } public String getValue() { return value; } } ![复制代码][copycode.gif] 老规矩,反编译看看变化?(其实也就看看static静态块和构造方法有什么变化就好了) ![复制代码][copycode.gif] public final class ColorEnum extends Enum { public static ColorEnum[] values() { return (ColorEnum[])$VALUES.clone(); } public static ColorEnum valueOf(String s) { return (ColorEnum)Enum.valueOf(ColorEnum, s); } //构造方法在原基础上加上我们新增的两个形参 private ColorEnum(String s, int i, String s1, String s2) { super(s, i); key = s1; value = s2; } //自定义方法,通过key值获得对应的枚举对象 public static ColorEnum getEnumByKey(String s) { if(null == s) return null; ColorEnum acolorenum[] = values(); int i = acolorenum.length; for(int j = 0; j < i; j++) { ColorEnum colorenum = acolorenum[j]; if(colorenum.getKey().equals(s)) return colorenum; } return null; } public String getKey() { return key; } public String getValue() { return value; } public static final ColorEnum RED; public static final ColorEnum GREEN; public static final ColorEnum BLUE; //我们自定义的两个字段 private final String key; private final String value; private static final ColorEnum $VALUES[]; static { RED = new ColorEnum("RED", 0, "red", "\u7EFE\u3223\u58CA"); GREEN = new ColorEnum("GREEN", 1, "green", "\u7F01\u80EF\u58CA"); BLUE = new ColorEnum("BLUE", 2, "blue", "\u9483\u6FCA\u58CA"); $VALUES = (new ColorEnum[] { RED, GREEN, BLUE }); } } ![复制代码][copycode.gif] ## 3.枚举的好处以及与常量类的区别 ## -------------------- 1)枚举型可以直接与数据库打交道,我通常使用varchar类型存储,对应的是枚举的常量名。(数据库中好像也有枚举类型,不过也没用过) 2) switch语句支持枚举型,当switch使用int、String类型时,由于值的不稳定性往往会有越界的现象,对于这个的处理往往只能通过if条件筛选以及default模块来处理。而使用枚举型后,在编译期间限定类型,不允许发生越界的情况 3) 当你使用常量类时,往往得通过equals去判断两者是否相等,使用枚举的话由于常量值地址唯一,可以用==直接对比,性能会有提高 4) 常量类编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译引用常量的类,因为里面存的是旧值。枚举类编译时,没有把常量值编译到代码里,即使常量的值发生变化,也不会影响引用常量的类。 5)枚举类编译后默认为final class,不允许继承可防止被子类修改。常量类可被继承修改、增加字段等,容易导致父类的不兼容。 ………………欢迎补充! 总结:常量的定义在开发中是必不可少的,虽然无论是通过常量类定义常量还是枚举定义常量都可以满足常量定义的需求。但个人建议最好是使用枚举类型。 ## 4.枚举常用方法 ## -------------------- **1.values()获取存储枚举中所有常量实例的数组。常配合foreach完成遍历** for(ColorEnum temp:ColorEnum.values()){ System.out.println(temp); } 运行结果: RED GREEN BLUE 2.构造方法,枚举的构造方法只能用private修饰符修饰,原因就不需要解释了…… 3.valueOf()通过常量名获取对应的枚举实例。 ColorEnum red = ColorEnum.valueOf("RED"); System.out.println(red); [Link 1]: http://blog.csdn.net/gaohuanjie/article/details/18140279 [copycode.gif]: /images/20220322/ae15a0cce5e74b2eab35f607b2cf9d1c.png
相关 如何枚举一个枚举 问题描述: 如何在 C\ 中枚举 enum? 例如,以下代码无法编译: public enum Suit { Spa 今天药忘吃喽~/ 2024年03月31日 17:45/ 0 赞/ 130 阅读
相关 【枚举】信息类枚举 > `前言` 比如用户信息里面有个等级,12345。 通常,我们是建一个枚举类。 替代方法: 在实体类下添加自定义获取名称的方法。 好处:如果项目服务很多,方 拼搏现实的明天。/ 2022年12月24日 01:54/ 0 赞/ 277 阅读
相关 枚举 include <stdio.h> / 枚举 1, 什么是枚举 把一个事物所有可能的取值一一列举出来 2, 枚举的优缺点 冷不防/ 2022年10月02日 05:45/ 0 赞/ 189 阅读
相关 枚举 在学C++和做一些实践的时候发现,枚举类型有时候是必要的。 有时我们希望某些常量只在类中有效。由于\define定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用co 骑猪看日落/ 2022年08月27日 10:55/ 0 赞/ 267 阅读
相关 枚举 当定义一个枚举时,编译器就会创建一个扩展java.lang.Enum类的类定义。这个类是java.lang.Object的一个直接后代。但与普通类不同的是,枚举具有以下属性: 谁践踏了优雅/ 2022年06月10日 08:23/ 0 赞/ 287 阅读
相关 枚举 在第一次学习面向对象编程时,我记得最深的一句话就是“万物皆对象”。于是我一直秉承着这个思想努力的学习着JAVA,直到学习到枚举(Enum)时,看着它颇为奇怪的语法……我一直 Myth丶恋晨/ 2022年04月23日 08:34/ 0 赞/ 308 阅读
相关 枚举 题目:有3个方格,每个方格里面都有一个整数a1,a2,a3。已知0 <= a1, a2, a3 <= n,而且a1 + a2是2的倍数,a2 + a3是3的倍数, a1 + a 客官°小女子只卖身不卖艺/ 2022年04月06日 04:22/ 0 赞/ 266 阅读
相关 枚举 JDK1.5之前需要自定义枚举类 JDK 1.5 新增的 enum 关键字用于定义枚举类 若枚举只有一个成员, 则可以作为一种单例模式的实现方式 枚举类对象的属性 亦凉/ 2022年03月22日 02:54/ 0 赞/ 333 阅读
相关 枚举 枚举 什么是枚举? 枚举指的是在一定范围内取值,这个值必须是枚举类型中的任意一个,而且只能够取其中的一个 枚举的特点: 1.枚举的本质就是一个Java类 叁歲伎倆/ 2022年03月18日 01:28/ 0 赞/ 387 阅读
还没有评论,来说两句吧...