简单介绍
Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型。要了解枚举类型,建议大家先打开jdk 中的Enum 类简单读一下,这个类里面定义了很多protected 方法,比如构造函数,如果要使用这些方法我们可以把枚举类型定义到当前类中。每个枚举类型,都有自己的名字和顺序,当我们输出一个枚举类型的时候,会输入枚举类型的name ,具体可以参考下面的例子。
一、 通常定义常量方法
我们通常利用public final static 方法定义的代码如下,分别用1 表示红灯,3 表示绿灯,2 表示黄灯。
package com.wbg; public class Light { /* 红灯 */ public final static int RED =1; /* 绿灯 */ public final static int GREEN =3; /* 黄灯 */ public final static int YELLOW =2; }
二、 枚举类型定义常量方法
枚举类型提供了构造函数,我们可以通过构造函数和覆写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.wbg; 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); } } }