`
learen
  • 浏览: 10706 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

黑马程序员 枚举的深入理解

阅读更多

   ------- android培训java培训、期待与您交流! ----------

   首先我们知道枚举是一个特殊的类,构造方法是私有的,那么它的对象是如何构造的呢?或者说是什么时候构造的呢?带着这个疑问,我查阅了一下枚举类的反编译代码(可能不准确,仅供参考)

enum Color {  
   
	// 所有的枚举值都是类静态常量  
	public static final Color RED;  
	public static final Color BLUE;  
	public static final Color BLACK;  
	public static final Color YELLOW;  
	public static final Color GREEN;  

	// 初始化过程,对枚举类的所有枚举值对象进行第一次初始化  
	static {  
	      0  new hr.test.Color [1]   
	      3  dup  
	      4  ldc <String "RED"> [16] //把枚举值字符串"RED"压入操作数栈  
	      6  iconst_0  // 把整型值0压入操作数栈  
	      7  invokespecial hr.test.Color(java.lang.String, int) [17] //调用Color类的私有构造器创建Color对象RED  
	     10  putstatic hr.test.Color.RED : hr.test.Color [21]  //将枚举对象赋给Color的静态常量RED。  
	      .........  枚举对象BLUE等与上同  
	    102  return  
	};  
	    
	  // 私有构造器,外部不可能动态创建一个枚举类对象(也就是不可能动态创建一个枚举值)。  
	private Color(java.lang.String arg0, int arg1){  
	     // 调用父类Enum的受保护构造器创建一个枚举对象  
	     3  invokespecial java.lang.Enum(java.lang.String, int) [38]  
	};  
	   
	public static Color[] values();  
	    
	   // 实现Enum类的抽象方法    
	public static Color valueOf(String arg0);  
}  

   源码之前,了无秘密。通过上面的源码我们可以看到,枚举类型的各个值是在这个类第一次被类加载器加载的时候在静态代码中被构建的,当类加载完成后,类的各个对象就都已经生成好了,有且只有一份,所以它可以用来实现单例模式。

   通过观看张孝祥老师的视频,我发现枚举在描述一定个数的具有相同属性的元素方面具有特别好的效果。比如交通灯项目中的路,只有8条(只说明问题,不管实际是双向四车道还是双向八车道),个数是一定的,而且功能相似。再比如银行业务系统中服务窗口一共有6个,数目也是固定的而且属性相似。这些问题都可以抽象成枚举,当然你用单例模式也是可以的,但是没有枚举直观。我想这也就是枚举存在的真正意义吧!简化了人们的开发,对问题的描述更加准确。

   所有的枚举类都继承了Enum的方法,具体每个方法都起到什么作用请自行查看API,在这里就不做详细介绍了。

分享到:
评论

相关推荐

    深入理解 Java 枚举(枚举的方法+枚举的特性+枚举可以实现接口+组织枚举+策略枚举+枚举工具类等)

    深入理解 Java 枚举(枚举的方法+枚举的特性+枚举可以实现接口+组织枚举+策略枚举+枚举工具类等)

    黑马程序员入学测试题详解

    4、 定义一个交通灯枚举,包含红灯、绿灯、黄灯,需要有获得下一个灯的方法,例如:红灯获取下一个灯是绿灯,绿灯获取下一个灯是黄灯。 5、 编写一个类,增加一个实例方法用于打印一条字符串。并使用反射手段...

    深入理解C语言指针的秘密.doc

    你还在为了不能掌控指针的而苦恼吗?仔细阅读本文,你将发现指针原来并不像你想象的那么难以理解!

    理解java枚举类型

    理解java枚举类型

    易语言枚举窗口易语言枚举窗口易语言枚举窗口

    易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载他人的 源码易语言枚举窗口,转载...

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名。本项目为普通java项目

    USB枚举详细过程剖析

    从驱动开发网看到一篇《USB枚举详细过程分析》,依据自己的理解和经验对原文稍加改动。本文仅供参考,一些顺序并不是固定的。  本文描述的是Windows系统的USB枚举过程,但对嵌入式系统自行开发的USB主机驱动程序也...

    java枚举结果类、根据状态值获取枚举值

    java枚举结果类、根据状态值获取枚举值 Controller: /** 模块类型枚举 */ model.addAttribute("mType", ModuleTypeEnum.ModuleTypeShow()); ftl: value="${mType.key}:${mType.value}” &lt;/#list&gt;

    深入理解C++11

    《深入理解C++11:C++11新特性解析与应用》内容简介:国内首本全面深入解读C++11新标准的专著,由C++标准委员会代表和IBM XL编译器中国开发团队共同撰写。不仅详细阐述了C++11标准的设计原则,而且系统地讲解了C++11...

    深入理解c++11

    《深入理解C++11:C++11新特性解析与应用》内容简介:国内首本全面深入解读C++11新标准的专著,由C++标准委员会代表和IBM XL编译器中国开发团队共同撰写。不仅详细阐述了C++11标准的设计原则,而且系统地讲解了C++11...

    mfc 枚举进程 mfc 枚举进程

    mfc 枚举进程 mfc 枚举进程 mfc 枚举进程 mfc 枚举进程 mfc 枚举进程

    Unity-C#-遍历枚举,通过枚举对象获取枚举类型.txt

    枚举参数与对象类型进行比较,判断是否属于同一类型

    SpringBoot 枚举类型转换

    在SpringBoot 项目中实现枚举转换,需要创建BaseEnumTypeHandler 类继承BaseEnum 和 BaseTypeHandler 等相关类。想要详细了解如何实现枚举转换的话,那你快点下载后深入理解吧!

    深入理解c++11新特性解析与应用

    《深入理解C++11:C++11新特性解析与应用》内容简介:国内首本全面深入解读C++11新标准的专著,由C++标准委员会代表和IBM XL编译器中国开发团队共同撰写。不仅详细阐述了C++11标准的设计原则,而且系统地讲解了C++11...

    Java中怎样由枚举常量的ordinal值获得枚举常量对象

    Java1.5提供了关键字enum,能够通过该关键字方便得定义自己须要的枚举类型,比方  enum Season {  SPRING, SUMMER, AUTUMN, WINTER  }  定义了一个季节枚举类型。  在本例中,对于Season.SPRING这个...

    跟涛哥一起学嵌入式30:C语言枚举类型深入剖析.pdf

    C语言枚举类型深入讲解,超详细:enum经常使用的三种方法;枚举的本质;枚举和宏定义的对比分析;Linux内核中的枚举类型及使用技巧分析;使用枚举需要注意的一些细节,在这篇文档中都会详细讲解。

    枚举.pdf枚举.pdf

    枚举.pdf枚举.pdf枚举.pdf枚举.pdf枚举.pdf枚举.pdf枚举.pdf枚举.pdf枚举.pdf枚举.pdf

    java枚举实例代码

    java枚举小例子,简单了解枚举的用法,适合初学者使用。

    thinkPHP调用枚举类型

    thinkPHP调用枚举类型,里面根据参数不同返回值不同,初步只封装了input(radio、check)、td、select等。

Global site tag (gtag.js) - Google Analytics