原文网址:http://iaiai.iteye.com/blog/1843553

1   背景

在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量。之前我们通常利用public final static 方法定义的代码如下,分别用1 表示春天,2表示夏天,3表示秋天,4表示冬天。

Java代码  
  1. public class Season {
  2. public static final int SPRING = 1;
  3. public static final int SUMMER = 2;
  4. public static final int AUTUMN = 3;
  5. public static final int WINTER = 4;
  6. }

这种方法称作int枚举模式。可这种模式有什么问题呢,我们都用了那么久了,应该没问题的。通常我们写出来的代码都会考虑它的安全性、易用性和可读性。

首先我们来考虑一下它的类型安全性。当然这种模式不是类型安全的。比如说我们设计一个函数,要求传入春夏秋冬的某个值。但是使用int类型,我们无法保证传入的值为合法。代码如下所示:

Java代码  
  1. public class Season {
  2. public static final int SPRING = 1;
  3. public static final int SUMMER = 2;
  4. public static final int AUTUMN = 3;
  5. public static final int WINTER = 4;
  6. private String getChineseSeason(int season){
  7. StringBuffer result = new StringBuffer();
  8. switch(season){
  9. case Season.SPRING :
  10. result.append("春天");
  11. break;
  12. case Season.SUMMER :
  13. result.append("夏天");
  14. break;
  15. case Season.AUTUMN :
  16. result.append("秋天");
  17. break;
  18. case Season.WINTER :
  19. result.append("冬天");
  20. break;
  21. default :
  22. result.append("地球没有的季节");
  23. break;
  24. }
  25. return result.toString();
  26. }
  27. public void doSomething(){
  28. System.out.println(this.getChineseSeason(Season.SPRING));//这是正常的场景
  29. System.out.println(this.getChineseSeason(5));//这个却是不正常的场景,这就导致了类型不安全问题
  30. }
  31. public static void main(String[] arg){
  32. Season season = new Season();
  33. season.doSomething();
  34. }
  35. }

程序getChineseSeason(Season.SPRING)是我们预期的使用方法。可getChineseSeason(5)显然就不是了,而且编译很通过,在运行时会出现什么情况,我们就不得而知了。这显然就不符合Java程序的类型安全。

接下来我们来考虑一下这种模式的可读性。使用枚举的大多数场合,我都需要方便得到枚举类型的字符串表达式。如果将int枚举常量打印出来,我们所见到的就是一组数字,这是没什么太大的用处。我们可能会想到使用String常量代替int常量。虽然它为这些常量提供了可打印的字符串,但是它会导致性能问题,因为它依赖于字符串的比较操作,所以这种模式也是我们不期望的。

从类型安全性和程序可读性两方面考虑,int和String枚举模式的缺点就显露出来了。幸运的是,从Java1.5发行版本开始,就提出了另一种可以替代的解决方案,可以避免int和String枚举模式的缺点,并提供了许多额外的好处。那就是枚举类型(enum type)。接下来的章节将介绍枚举类型的定义、特征、应用场景和优缺点。

2   定义

枚举类型(enum type)是指由一组固定的常量组成合法的类型。Java中由关键字enum来定义一个枚举类型。下面就是java枚举类型的定义。

Java代码  
  1. public enum Season {
  2. SPRING, SUMMER, AUTUMN, WINTER;
  3. }

3   特点

Java定义枚举类型的语句很简约。它有以下特点: 
1)  使用关键字enum 
2)  类型名称,比如这里的Season 
3)  一串允许的值,比如上面定义的春夏秋冬四季 
4)  枚举可以单独定义在一个文件中,也可以嵌在其它Java类中 
除了这样的基本要求外,用户还有一些其他选择 
5)  枚举可以实现一个或多个接口(Interface) 
6)  可以定义新的变量 
7)  可以定义新的方法 
8)  可以定义根据具体枚举值而相异的类 
4   应用场景

以在背景中提到的类型安全为例,用枚举类型重写那段代码。代码如下:

Java代码  
  1. public enum Season {
  2. SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4);
  3. private int code;
  4. private Season(int code){
  5. this.code = code;
  6. }
  7. public int getCode(){
  8. return code;
  9. }
  10. }
Java代码  
  1. public class UseSeason {
  2. /**
  3. * 将英文的季节转换成中文季节
  4. * @param season
  5. * @return
  6. */
  7. public String getChineseSeason(Season season){
  8. StringBuffer result = new StringBuffer();
  9. switch(season){
  10. case SPRING :
  11. result.append("[中文:春天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
  12. break;
  13. case AUTUMN :
  14. result.append("[中文:秋天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
  15. break;
  16. case SUMMER :
  17. result.append("[中文:夏天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
  18. break;
  19. case WINTER :
  20. result.append("[中文:冬天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
  21. break;
  22. default :
  23. result.append("地球没有的季节 " + season.name());
  24. break;
  25. }
  26. return result.toString();
  27. }
  28. public void doSomething(){
  29. for(Season s : Season.values()){
  30. System.out.println(getChineseSeason(s));//这是正常的场景
  31. }
  32. //System.out.println(getChineseSeason(5));
  33. //此处已经是编译不通过了,这就保证了类型安全
  34. }
  35. public static void main(String[] arg){
  36. UseSeason useSeason = new UseSeason();
  37. useSeason.doSomething();
  38. }
  39. }
引用
[中文:春天,枚举常量:SPRING,数据:1]  
[中文:夏天,枚举常量:SUMMER,数据:2]  
[中文:秋天,枚举常量:AUTUMN,数据:3]  
[中文:冬天,枚举常量:WINTER,数据:4]

这里有一个问题,为什么我要将域添加到枚举类型中呢?目的是想将数据与它的常量关联起来。如1代表春天,2代表夏天。

5   总结

那么什么时候应该使用枚举呢?每当需要一组固定的常量的时候,如一周的天数、一年四季等。或者是在我们编译前就知道其包含的所有值的集合。优点是:枚举能满足绝大部分程序员的要求的,它的简明,易用的特点是很突出的。缺点:与int常量相比,枚举有个小小的性能缺点,即装载和初始化枚举时会有空间和时间的成本。如受资源约束的设备:手机等。

【转】掌握java枚举类型(enum type)相关推荐

  1. java 枚举类 int_【转】掌握java枚举类型(enum type)

    原文网址:http://iaiai.iteye.com/blog/1843553 1   背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...

  2. java的枚举类型是什么_什么是枚举(java枚举类型enum用法)

    最佳回答 枚举 1.枚举 (enumeration) 值类型的一种特殊形式,它从 System.Enum 继承,并为基础基元类型的值提供备用名称.枚举类型有名称.基础类型和一组字段.基础类型. &qu ...

  3. java 枚举类型enum的用法详解

    Java Enum原理 public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要 ...

  4. java枚举类型enum用法和写法

    java枚举类型enum用法,enum的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 Java.lang 包中,在上面的这种情况下,enum就能派上用场了.枚举类型的用 ...

  5. Java枚举类型(enum)详解

    文章目录 理解枚举类型 枚举的定义 枚举实现原理 枚举的常见方法 Enum抽象类常见方法 编译器生成的Values方法与ValueOf方法 枚举与Class对象 枚举的进阶用法 向enum类添加方法与 ...

  6. Java枚举类型Enum用途总结

    枚举类型Enum主要用途之一,是用来管理错误码,状态码.Enum类型实质是一种特殊的class,它不可以继承其他类,也不可以被其他类继承,但可以实现接口. 示例一: public class Enum ...

  7. java枚举类型enum用法_java枚举类型enum用法和原理介绍【传智播客】

    Enum枚举类型 Enum的全写是Enumeration,这个词的翻译是列举.逐条陈述.细目.在程序语言中,枚举类型是一种特殊的数据类型(常用的数据类型比如字符串.整型),这种数据类型的变量值限定在固 ...

  8. Java枚举类型 enum

    定义 An enum type is a special data type that enables for a variable to be a set of predefined constan ...

  9. java 枚举类型enum

    简单介绍 Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型.要了解枚举类型,建议大家先打开jdk 中的Enum 类简单读一下,这个类 ...

最新文章

  1. 一行代码搞定WordPress面包屑导航breadcrumb
  2. 一起学windows phone7开发(二十二.使用系统资源)
  3. Nginx monitor
  4. ruby web性能响应时间
  5. 小白都能了解的聚类算法之四(谱聚类)
  6. 小技巧,如何把上传文件的浏览按钮换成其他样式 或者图片
  7. [下载]最新QQ空间牧场开通器 V2.0
  8. 英特尔cpu发布时间表_Intel一口气确认11代/12代酷睿桌面CPU发布时间:Zen4接招
  9. python用Selenium爬取携程网机票信息
  10. ubuntu扩容教程
  11. 如何显示密件抄送人员地址_什么是密件抄送,以及为什么不使用它会成为一个可怕的人...
  12. 打印论文是单面还是双面?
  13. 用函数求最大公约数c语言,C语言求最大公约数公式分享
  14. leetcode【中等】838、推多米诺
  15. 最新Google Earth 5.0简体中文版发布
  16. java forclass_Java,For Class in Class
  17. (附带一键脚本)Android安卓手机使用linuxdeploy做debian服务器安装homeassistant教程
  18. 在ubuntu安装最新版QQ教程
  19. 百度地图API之获取真实轨迹
  20. 概率论与数理统计第一章课后题答案及详解

热门文章

  1. 星型模型 3nf的区别_数据库和数据仓库的区别和联系
  2. 分享一个selenium jar包 的下载地址,各版本都有,包括selenium-server-standalone.jar、selenium、selenium-server
  3. html列自动变高,HTML_CSS三行三列DIV高度自适应的设置,用脚本控制三行三列div高度自 - phpStudy...
  4. C语言有好多7,[c语言]有1到100个数,现在从中提取7、和个位或十位上有7的数、以及7的倍数,然后输出。...
  5. java 元数据 注解_Java元数据总结:Java注释的使用和定义
  6. excel设置单元格整数后还是有小数点_一招教你统一解决excel单元格的单位问题!...
  7. 怎么在堆叠柱状图中体现百分比_微生物门类堆叠柱状图一文解决
  8. cv_load_image_anycolor 什么意思_LOL英雄联盟手游use a ping什么意思?怎么给队友发信号?...
  9. 目前用到的两个分页存储过程:
  10. Storey FDR矫正方法