引用并转载于: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. Win 8下Rime输入法无法同步的临时解决方法

    意外发现了Rime输入法(OS X上叫鼠须管'Squirrel',windows上叫小狼毫'Weasel',linux上叫中州韵'ibus-rime',连名字都起的这么牛逼),真是神器啊,流畅的速度, ...

  2. Java ActiveMQ 讲解(一)理解JMS 和 ActiveMQ基本使用

    最近的项目中用到了mq,之前自己一直在码农一样的照葫芦画瓢.最近几天研究了下,把自己所有看下来的文档和了解总结一下. 一. 认识JMS 1.概述 对于JMS,百度百科,是这样介绍的:JMS即Java消 ...

  3. asp.net 错误页面自定义

    在我们上网浏览信息的时候,总会有出现404页面的时候,在我们开发的时候也可以自定义这些页面.刚回这次项目中也使用到了,就在网上找到一些方法,今天就把这些方法重新写一遍加深记忆. 在项目的web.con ...

  4. 日笔记--C# 从数据库取表格到DataGridView---json传输

    只作为个人学习笔记. class OpData { // 创建一个和客户端通信的套接字 Socket socketwatch = null; //连接Access字符串 string strCon; ...

  5. WPF 平板上按钮点击不触发,鼠标点击触发的两种解决方法

    今天运行在windows平板上的程序,有个功能是弹出子窗体,点弹出窗体的关闭按钮,要点好几次才能触发.网上找了找,也有人与我类似的情形. 解决方法如下: public static void Disa ...

  6. 配置DNS服务器转发器

    1.(windows server 2008 r2)控制面板->管理工具->服务器管理器->DNS->服务器图标->属性 2.转发器->编辑 3.填写DNS并点击确 ...

  7. codeforces 1096 题解

    A: 发现最优的方案一定是选 $ l $ 和 $ 2 * l $,题目保证有解,直接输出即可 #include <bits/stdc++.h> #define Fast_cin ios:: ...

  8. leetcode-77-组合

    题目描述: 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], ...

  9. leetcode-268-Missing Number(异或)

    题目描述: Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is ...

  10. CSS03--框模型、定位position、浮动

    我们接着“CSS02”,继续学习一些新的样式属性. 1.框模型:   规定了元素框处理  元素内容.内边距(padding).边框(border).外边距(margin,可以是负值)的方式 2.内边距 ...