引用并转载于:http://blog.csdn.net/ishallwin/article/details/9440251

1.什么是枚举:

在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。

例如:星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。

在java中如何更好的使用这些“数据集”呢?因此枚举便派上了用场。

枚举是限定有限可能值的一种手段,使用枚举可以降低程序出错的几率,并可以提高代码的可读性与可维护性。

Java中的枚举并不是简单常量的集合,而是一个对象,其本质依然是类,

所以Java中的枚举除了提供一系列相关值以外,还提供了一些额外功能,甚至还可以根据需要自行添加一些功能。

2. 常规用法

尽管Java中的枚举是对象,但是大多数使用它的场景与其它语言中并无二致。

     2.1 定义

定义枚举需要使用关键字enum。例如一个应用需要使用一系列特定的颜色值,则可以定义一个类似以下形式的枚举。

这里是直接定义了一个MyColor.java的文件,文件的内容如下:

 //这里不用写class关键字,因为只要有enum这个类就会自动继承
//java.lang.Enum类
public enum MyColor{
//每个枚举值用逗号隔开,
RED,
BLUE,
GREEN;//最后的分号可要或不要
}

可以看到enum真是一个对象,因为生成了MyColor.class文件:

     2.2.  使用

枚举定义完成以后,就可以以“枚举名.枚举项”的形式在代码中对定义的枚举进行使用。

在特殊情况下,如果程序能够识别出当前的枚举类型,则只需要给出枚举项即可,

例如:

在switch语句块中的case关键字后的常量值。

 public class Test1{
public static void main(String[] args){
// MyColor myColor = new MyColor();
//这里不能直接实例化它,尽管MyColor实质是一个类
//后面会有详细解释,因为它的构造方法默认是私有的
MyColor myColor = MyColor.RED;
switch(myColor){
case BLUE://这里就可以直接使用枚举值
System.out.println("蓝色");
break;
case GREEN:
System.out.println("绿色");
break;
case RED:
System.out.println("红色");
break;
default:
System.out.println("什么色?");
break;
}
}
}

3. Enum类型的常用方法

Java枚举提供了几个方法供开发者在需要时调用,

对于枚举对象,主要可用的方法为values(),它返回当前枚举中定义的所有枚举项的集合;

对于枚举项,主要可用的方法有3个方法ordinal()、name()和getDeclaringClass()。

方法ordinal()返回枚举项在枚举对象中的序号,从0开始;

方法name()则返回枚举项的名称(与方法toString效果相同),通常用于取得枚举变量中保存的枚举项名称;

方法getDeclaringClass()则用于取得当前枚举值所在类的完整名称。

此外,枚举项之间还可以通过方法compareTo()进行比较,如果参数传入的枚举项与当前值相等,则返回0。

测试代码:

 public class Test{
public enum MyColor{
RED,
BLUE,
GREEN;
} public static void main(String[] args){
for(MyColor myColor: MyColor.values()){
System.out.println(myColor);
System.out.println(myColor.ordinal());
System.out.println(myColor.name());
System.out.println(myColor.getDeclaringClass());
System.out.println("============================================");
}
} }

其运行结果如图 :

通过javac编译后可以看到,enum的确是作为类而存在,因为编译后生成了2个class文件   

4. 为枚举添加构造器和成员方法

       4.1.构造器

类拥有构造器,枚举是一种特殊的类,所以枚举也可以拥有自己的构造器。

但与普通类的不同之处在于枚举的构造器不可以是public的,其原因在于该构造器是提供给枚举对象中的枚举项构造时使用的,它并不需要在枚举对象之外使用。

例如,如果希望枚举MyColor中的每个枚举项包含有相应的中文说明以及其对应的Color信息,

则可以为MyColor增加一个包含有两个参数的构造器,并且在声明每一个枚举项时使用这个构造器进行构造。其实现代码如下:

 import java.awt.Color;
public enum MyColor{
/*
*关于枚举类型的构造方法,只需要记住两点
*1.枚举类型的构造方法是被枚举项使用的,而不是被外部使用的
*/
RED("红色",Color.RED),
BLUE("蓝色",Color.BLUE),
GREEN("绿色",Color.GREEN); private String description;
private Color color; /*
*2.枚举类型的构造方法是私有的private,这就很好的说明了第一点
* 所以枚举的使用是不能通过new来使用的,
* 而是使用 枚举类型.枚举项
**/
private MyColor(String desc,Color color){
this.description = desc;
this.color = color;
} public static void main(String[] args){
for(MyColor mc:MyColor.values()){
System.out.println(mc.description);
System.out.println(mc.color.toString());
}
}
}

结果如图:

     

      4.2.  成员方法

如同可以为枚举添加构造器(构造方法)一样也可以为枚举类型添加方法。

例如上述代码中,通过构造器为每个枚举项添加了中文说明以及其对应的Color信息,

那么为了取出枚举项对应的信息,则需要为枚举MyColor添加如下相应方法。

     //返回当前描述
public String getDescription() {
return this.description;
} //返回对应的颜色
public Color getColor(){
return this.color;
}

可以看到,通过以上机制,可以将枚举本身要表达的含义与其具体的信息很好地整合起来,杜绝了传统编程语言中含义与信息分离的弊端。

5、枚举集合

Java中的枚举是一个对象,枚举对象中的各枚举项也是对象。

在Java中,集合容器要求存储在其中的每一个成员均是对象类型,而枚举作为一种特殊的类,

Java亦专门为枚举提供了集合容器EnumSet和EnumMap。

      5.1. EnumSet

EnumSet用于保存枚举项的集合,在枚举项本身并不互斥的情况下特别有用。

例如,一个应用系统通常会有多种角色,而某些人在系统中可能承担不止一种角色。如果这些角色是通过枚举定义的,则此时EnumSet将可以将多种角色保存在一起,标识特定用户承担的全部角色。

EnumSet扩展于AbstractSet,它除了拥了普通Set所拥有的方法外,主要是增加了一系列可产生EnumSet实例的方法(noneOf、allOf、copyOf、complementOf、of、range等)。

以下是使用EnumSet的of方法产生一个EnumSet实例的示例。

 import java.util.EnumSet;
public class EnumSetTest{
public enum Role{
ROOT,TEST,CUSTOMER
} public static void main(String[] args){
//EnumSet.of()是往里面添加元素
EnumSet<Role> es = EnumSet.of(Role.ROOT,Role.TEST);
for(Role r:es){
System.out.println(r);
}
}
}

更多EnumSet的方法,请参考:http://tool.oschina.net/apidocs/apidoc?api=jdk_7u4

          5.2. EnumMap

EnumMap是必须使用枚举项作为其KEY的Map,其法与普通Map类似。

更多EnumMap请参考:http://tool.oschina.net/apidocs/apidoc?api=jdk_7u4

Java的枚举类型的更多相关文章

  1. 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题(转)

    写在前面: Java SE5 提供了一种新的类型 Java的枚举类型,关键字 enum 可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能 ...

  2. 深度分析Java的枚举类型—-枚举的线程安全性及序列化问题

    原文:深度分析Java的枚举类型--枚举的线程安全性及序列化问题 枚举是如何保证线程安全的 要想看源码,首先得有一个类吧,那么枚举类型到底是什么类呢?是enum吗?答案很明显不是,enum就和clas ...

  3. Java enum枚举类型

    java的枚举类型详解: 简单示例: public enum Color{ RED,BLUE,BLACK,YELLOW,GREEN } 复杂示例(带自定义构造方法与类型) public enum En ...

  4. Java的枚举类型使用方法详解

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

  5. (转+原创)java的枚举类型Enum解释

    原文:http://www.cnblogs.com/mxmbk/articles/5091999.html 下文中还添加了个人的一些补充和理解. 在Java SE5之前,我们要使用枚举类型时,通常会使 ...

  6. [转载] Java中枚举类型的使用 - enum

    目录 1 枚举类的编译特性 2 向枚举类中添加方法 3 接口内部创建枚举 4 枚举类中使用枚举 5 扩展: 验证values()不是通过父类继承的 本文转载自博客 - Java枚举类型, 博主对原文内 ...

  7. java中枚举类型的使用

    Java 枚举(enum) 详解7种常见的用法 JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. web项目里实体类使用枚举类型: 一般在该实体 ...

  8. java之 ------ 枚举类型

    枚举 一.枚举类型具体说明 简单的说.Enum一般用来表示一组同样类型的常量. 如性别.日期.月份.颜色等.对这些属性用常量的优点是显而易见的,不仅能够保证单例,且在比較的时候能够用"==& ...

  9. MyBatis(八):Mybatis Java API枚举类型转化的用法

    最近工作中用到了mybatis的Java API方式进行开发,顺便也整理下该功能的用法,接下来会针对基本部分进行学习: 1)Java API处理一对多.多对一的用法: 2)增.删.改.查的用法: 3) ...

随机推荐

  1. zookeeper zoo.cfg配置文件

      一.zookeeper的配置文件  zoo.cfg   配置文件是我们安装zookeeper的时候复制 重命名出来的文件    命令: cp zoo_smaple.cfg zoo.cfg zkSe ...

  2. 【node错误】/usr/bin/env: node: No such file or directory

    背景 安装了node后,执行npm run xxx的命令的时候,报错,提示如下: /usr/bin/env: node: No such file or directory 步骤 1. 什么玩意,执行 ...

  3. awk中NF的使用

    统计机器中网络连接各个状态个数 netstat -a | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'   一下子不明白$NF是什么意 ...

  4. .net core 自制错误日志

    前言 之前.net framework用的ErrorLog帮助类,对于监控错误形成日志,内容非常清晰,想在.net core2.2中继续用,但是有很多不一样的地方,所以想总结一下. 首先需要HttpC ...

  5. 1-初步了解C#-语言基础

    本篇博客对应视频讲解 前言 终于开始讲语言了,我选择讲C#.为什么呢?因为C#是很好的入门语言,简洁.全面,面向对象类型安全,开发体验好,上手容易.而其他的语言也已经有人讲了很多了,C#相对来说要少一 ...

  6. Verify the Developer App certificate for your account is trusted on your device.

    1.报错内容 Could not launch "CH5203" Verify the Developer App certificate for your account is ...

  7. 【OCP-12c】CUUG 071题库考试原题及答案解析(20)

    20.choose two Examine the description of the EMP_DETAILS table given below: Which two statements are ...

  8. C# Winform 小技巧(Datagridview某一列按状态显示不同图片)

    步骤: 一.导入状态图片到项目中: 二.在窗体中声明一个图片数组,并在窗体的OnLoad事件中加入图片资源: /// <summary> /// 存储状态图片序列,避免同一状态对图片重复读 ...

  9. java实际项目中interface和abstract interface 区别

    参考:https://zhidao.baidu.com/question/424485344260391052.html 这2种有什么区别,根据实际项目经验 帮我解答下 谢谢啊~~~~~~~~~问题补 ...

  10. java异常术语

    .检查性异常: 不处理编译不能通过 .非检查性异常:不处理编译可以通过,如果有抛出直接抛到控制台(所有RuntimeException的派生类都是非检查型异常) .非运行时异常: 就是检查性异常4.运 ...