2015-10-24 java达人

Java 中 的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型。要了解枚举类型,建议大家先打开jdk 中的Enum类简单读一下,这个类里面定义了很多protected 方法,比如构造函数,如果要使用这些方法我们可以把枚举类型定义到当前类中。每个枚举类型,都有自己的名字和顺序,当我们输出一个枚举类型的时候,会输入 枚举类型的name ,具体可以参考下面的例子。

一、 通常定义常量方法

package com.csdn.myEnum;

public class Light {

/* 红灯 */

public final static int RED =1;

/* 绿灯 */

public final static int GREEN =3;

/* 黄灯 */

public final static int YELLOW =2;

}

二、 枚举类型定义常量方法

public enum Light {

RED , GREEN , YELLOW ;

}

我 们只能够表示出红灯、绿灯和黄灯,但是具体的值我们没办法表示出来。别急,既然枚举类型提供了构造函数,我们可以通过构造函数和覆写toString方法 来实现。首先给Light 枚举类型增加构造方法,然后每个枚举类型的值通过构造函数传入对应的参数,同时覆写toString 方法,在该方法中返回从构造函数中传入的参数,改造后的代码如下:

public enum Light {

// 利用构造函数传参

RED (1), GREEN (3), YELLOW (2);

// 定义私有变量

private int nCode ;

// 构造函数,枚举类型只能为私有

private Light( int _nCode) {

this.nCode = _nCode;

}

@Override

public String toString() {

return String.valueOf ( this . nCode );

}

}

三、 完整示例代码

枚举类型的完整演示代码如下:

package com.csdn.myEnum;

import java.util.EnumMap;

import java.util.EnumSet;

public class LightTest {

// 1. 定义枚举类型

public enum Light {

// 利用构造函数传参

RED (1), GREEN (3), YELLOW (2);

// 定义私有变量

private int nCode ;

// 构造函数,枚举类型只能为私有

private Light( int _nCode) {

this.nCode = _nCode;

}

@Override

public String toString() {

return String.valueOf ( this . nCode );

}

}

/**

* @param args

*/

public static void main(String[] args ) {

// 1. 遍历枚举类型

System.out.println( " 演示枚举类型的遍历 ......" );

testTraversalEnum ();

// 2. 演示 EnumMap 对象的使用

System.out.println( " 演示 EnmuMap 对象的使用和遍历 ....." );

testEnumMap ();

// 3. 演示 EnmuSet 的使用

System.out.println( " 演示 EnmuSet 对象的使用和遍历 ....." );

testEnumSet ();

}

/**

* 演示枚举类型的遍历

*/

private static void testTraversalEnum() {

Light[] allLight = Light.values ();

for (Light aLight : allLight) {

System.out.println( " 当前灯 name : " + aLight.name());

System.out.println( " 当前灯 ordinal : " + aLight.ordinal());

System.out.println( " 当前灯: " + aLight);

}

}

/**

* 演示 EnumMap 的使用, EnumMap 跟 HashMap 的使用差不多,只不过 key 要是枚举类型

*/

private static void testEnumMap() {

// 1. 演示定义 EnumMap 对象, EnumMap 对象的构造函数需要参数传入 , 默认是key 的类的类型

EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(

Light. class );

currEnumMap.put(Light. RED , " 红灯 " );

currEnumMap.put(Light. GREEN , " 绿灯 " );

currEnumMap.put(Light. YELLOW , " 黄灯 " );

// 2. 遍历对象

for (Light aLight : Light.values ()) {

System. out .println( "[key=" + aLight.name() + ",value="

+ currEnumMap.get(aLight) + "]" );

}

}

/**

* 演示 EnumSet 如何使用, EnumSet 是一个抽象类,获取一个类型的枚举类型内容<BR/>

* 可以使用 allOf 方法

*/

private static void testEnumSet() {

EnumSet<Light> currEnumSet = EnumSet.allOf (Light. class );

for (Light aLightSetElement : currEnumSet) {

System. out .println( " 当前 EnumSet 中数据为: " + aLightSetElement);

}

}

}

执行结果如下:

演示枚举类型的遍历 ......

当前灯 name : RED

当前灯 ordinal : 0

当前灯: 1

当前灯 name : GREEN

当前灯 ordinal : 1

当前灯: 3

当前灯 name : YELLOW

当前灯 ordinal : 2

当前灯: 2

演示 EnmuMap 对象的使用和遍历 .....

[key=RED,value= 红灯 ]

[key=GREEN,value= 绿灯 ]

[key=YELLOW,value= 黄灯 ]

演示 EnmuSet 对象的使用和遍历 .....

当前 EnumSet 中数据为: 1

当前 EnumSet 中数据为: 3

当前 EnumSet 中数据为: 2

四、 通常定义常量方法和枚举定义常量方法区别

1. 代码:

public static final int ON = 1;

}

有什么不好了,大家都这样用了很长时间了,没什么问题啊。

其次,你还要确保它的范围是0 和1

可以创建一个enum 类,把它看做一个普通的类。除了它不能继承其他类了。(java 是单继承,它已经继承了Enum),

3. switch() 参数可以使用enum了

4. values() 方 法是编译器插入到enum定义中的static 方法,所以,当你将enum 实例向上转型为父类Enum是,values()就不可访问了。解决办法:在Class中有一个getEnumConstants()方法,所以即便 Enum接口中没有values()方法,我们仍然可以通过Class对象取得所有的enum实例

5. 无法从enum 继承子类,如果需要扩展enum 中的元素,在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组。达到将枚举元素进行分组。

6. 使用EnumSet 代替标志。enum 要求其成员都是唯一的,但是enum 中不能删除添加元素。

7. EnumMap 的key 是enum ,value 是任何其他Object 对象。

8. enum 允许程序员为eunm 实例编写方法。所以可以为每个enum 实例赋予各自不同的行为。

9. 使用enum 的职责链(Chain of Responsibility) . 这个关系到设计模式的职责链模式。以多种不同的方法来解决一个问题。然后将他们链接在一起。当一个请求到来时,遍历这个链,直到链中的某个解决方案能够处理该请求。

10. 使用enum 的状态机

11. 使用enum 多路分发

java枚举类型enum的使用的更多相关文章

  1. 【转】java枚举类型enum的使用

    原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...

  2. 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)

    java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...

  3. 深入理解Java枚举类型(enum)

    https://blog.csdn.net/javazejian/article/details/71333103 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(en ...

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

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

  5. java 枚举类型 enum

    在java SE5中添加了枚举类型,即enum关键字.在这之前,当你需要创建一个整形常量集时,但是这些枚举值并不会必然的将其自身的取值限制在这个常量集的范围之内,因此这样做的显得不安全,也不方便使用. ...

  6. java 枚举类型enum

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

  7. Java枚举类型 enum

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

  8. Java枚举类型enum使用详解

      java的Enum枚举类型终于在j2se1.5出现了.之前觉得它只不过是鸡肋而已,可有可无.毕竟这么多年来,没有它,大家不都过得很好吗?今日看<Thinking in Java>4th ...

  9. 全面解读Java中的枚举类型enum的使用

    这篇文章主要介绍了Java中的枚举类型enum的使用,开始之前先讲解了枚举的用处,然后还举了枚举在操作数据库时的实例,需要的朋友可以参考下 关于枚举 大多数地方写的枚举都是给一个枚举然后例子就开始sw ...

随机推荐

  1. 说说log4cplus

    <C++ primer 第五版>已经翻了一段时间了,每天早上的班车上看一个小时.书是好书,可惜很多知识还是停留在表面上.每天除了翻书,一是也找到不合适的方法进一步深入,晚上看到新闻联播的老 ...

  2. Java设计模式09:单例模式的强化(控制实例个数n)

    1. 单例模式的本质: 控制实例数目(目的节约资源) 2. 单例模式体现的一些思想: (1)延迟装载(Lazy Load):懒汉式 (2)缓存:饿汉式 3. 单例模式的变形使用: 控制使用实例个数为3 ...

  3. php笔记03:布尔类型,字符串,浮点数

    1.布尔类型 下面情况都是看出false: 布尔类型FALSE自身 整型值为0 浮点型值为0.0 空字符串,以及字符串"0" 不包含任何元素的数组 不包含任何成员变量的对象(仅PH ...

  4. next nextval

    1 KMP算法中next与nextval值的计算 以上两张图代表了next值的求法,本人总结后做如下叙述: 根据公式可知: next[1]=0 next[2]=1 next[3]的求法根据公式可以直接 ...

  5. About gpref O(n2) --> O(1)

    http://www.ibm.com/developerworks/cn/linux/l-gperf.html 命令行处理和 gperf 的作用 命令行处理一直以来都是软件开发中最容易被忽视的领域.几 ...

  6. 让ubuntu使用root帐号并让winscp以root身份登录

    ubuntu 服务器默认的root账号是没有激活的,需要用初装的用户账号给root设置管理密码: $ sudo passwd root  //用sudo修改root帐户 Password: //输入密 ...

  7. background不能填充margin的问题

    CSS2 中有5个主要的背景(background)属性,它们是: background-color: 指定填充背景的颜色.background-image: 引用图片作为背景.background- ...

  8. [转]Install App to SD

    本文转自:http://www.douban.com/group/topic/29597344/ If you want to move more apps to the SD card, you'l ...

  9. CentOS 7 gedit编辑器中文乱码解决方法

    无需root登陆 打开终端输入如下命令: gsettings set org.gnome.gedit.preferences.encodings auto-detected "['GB180 ...

  10. 使用PSSH批量SSH操作Linux服务器

    http://www.opstool.com/article/266 服务器多了,有一个烦恼就是如何批量快速操作一堆服务器.这里我推荐一下经常使用利器pssh.这个工具给我的工作带来了莫大的帮助. 简 ...