摘要:枚举的实现原理通过使用反编译命令我们可以得出一下结论编译器将枚举类型编译为类型的类。由以上三点确保了枚举的特性之一枚举类型所具有的值是不可变的而枚举的另一个特性具有所有的值则是由程序员来实现。
定义
一个事物的所有值的集合。
枚举类型的属性
因为枚举类型所代表的是一个事物的所有值的集合,所以枚举类型应具有的属性为:
枚举类型所具有的值是不可变的。
具有所有的值
枚举的作用限定值的范围,通常可以用来限制接口的参数的取值范围。枚举的实现原理
通过使用反编译命令javap我们可以得出一下结论:
编译器将枚举类型编译为final类型的class类。
枚举中的每一个枚举值编译为“public static final 类型 枚举值”的形式。
编译器编译之后增加了一个静态块,在此静态块中创建一个新的对象并将此对象赋值给第2点中的静态对象。
由以上三点确保了枚举的特性之一:枚举类型所具有的值是不可变的
而枚举的另一个特性具有所有的值则是由程序员来实现。
使用javap -c 反编译结果为:
public final class Season extends java.lang.Enum{ public static final Season SPIRNG; public static final Season SUMMER; public static final Season AUTUMN; public static final Season WINTER; public static Season[] values(); Code: 0: getstatic #1 // Field $VALUES:[LSeason; 3: invokevirtual #2 // Method "[LSeason;".clone:()Ljava/lang/Object; 6: checkcast #3 // class "[LSeason;" 9: areturn public static Season valueOf(java.lang.String); Code: 0: ldc #4 // class Season 2: aload_0 3: invokestatic #5 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; 6: checkcast #4 // class Season 9: areturn static {}; Code: 0: new #4 // class Season 3: dup 4: ldc #7 // String SPIRNG 6: iconst_0 7: invokespecial #8 // Method " ":(Ljava/lang/String;I)V 10: putstatic #9 // Field SPIRNG:LSeason; 13: new #4 // class Season 16: dup 17: ldc #10 // String SUMMER 19: iconst_1 20: invokespecial #8 // Method " ":(Ljava/lang/String;I)V 23: putstatic #11 // Field SUMMER:LSeason; 26: new #4 // class Season 29: dup 30: ldc #12 // String AUTUMN 32: iconst_2 33: invokespecial #8 // Method " ":(Ljava/lang/String;I)V 36: putstatic #13 // Field AUTUMN:LSeason; 39: new #4 // class Season 42: dup 43: ldc #14 // String WINTER 45: iconst_3 46: invokespecial #8 // Method " ":(Ljava/lang/String;I)V 49: putstatic #15 // Field WINTER:LSeason; 52: iconst_4 53: anewarray #4 // class Season 56: dup 57: iconst_0 58: getstatic #9 // Field SPIRNG:LSeason; 61: aastore 62: dup 63: iconst_1 64: getstatic #11 // Field SUMMER:LSeason; 67: aastore 68: dup 69: iconst_2 70: getstatic #13 // Field AUTUMN:LSeason; 73: aastore 74: dup 75: iconst_3 76: getstatic #15 // Field WINTER:LSeason; 79: aastore 80: putstatic #1 // Field $VALUES:[LSeason; 83: return }
源代码:
public enum Season { SPIRNG, SUMMER, AUTUMN, WINTER; }
由于枚举类型使用static块来进行初始化,所以枚举类型仅仅在每次类加载的时候初始化,这种特性可以用来实现单例模式参考我的另外一篇文章单例模式
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77693.html
摘要:结构型模式适配器模式桥接模式装饰模式组合模式外观模式享元模式代理模式。行为型模式模版方法模式命令模式迭代器模式观察者模式中介者模式备忘录模式解释器模式模式状态模式策略模式职责链模式责任链模式访问者模式。 主要版本 更新时间 备注 v1.0 2015-08-01 首次发布 v1.1 2018-03-12 增加新技术知识、完善知识体系 v2.0 2019-02-19 结构...
摘要:枚举是声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。注意枚举只是枚举类型,不能够赋值操作。 枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。△有的地方还没有学的透彻,之后会继续学习修改更新本文章 1.枚...
摘要:常量接口是对接口的一种不良使用。如果这些常量最好被看作是枚举类型成员,那就应该用枚举类型来导出。因为客户端既不能创建枚举类型的实例,也不能对它进行扩展,因此很可能没有实例,而只有声明过的枚举常量。换句话说,枚举类型是实例受控的。 问题 我们偶尔能在项目中看到如下风格的代码: public class ResponseCode { public static final int ...
摘要:说到复盘基础,并不是所有的都会复盘,没那个时间更没那个必要。比如,一些基础的语法以及条件语句,极度简单。思前想后,我觉得整个计划应该从集合开始,而复盘的方式就是读源码。通常,队列不允许随机访问队列中的元素。 showImg(https://segmentfault.com/img/remote/1460000020029737?w=1080&h=711); 老读者都知道,我是自学转行...
阅读 3045·2021-10-12 10:12
阅读 5349·2021-09-26 10:20
阅读 1515·2021-07-26 23:38
阅读 2806·2019-08-30 15:54
阅读 1635·2019-08-30 13:45
阅读 1953·2019-08-30 11:23
阅读 3077·2019-08-29 13:49
阅读 819·2019-08-26 18:23