Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型。要了解枚举类型,建议大家先打开jdk 中的Enum类简单读一下,这个类里面定义了很多protected 方法,比如构造函数,如果要使用这些方法我们可以把枚举类型定义到当前类中。每个枚举类型,都有自己的名字和顺序,当我们输出一个枚举类型的时候,会输入枚举类型的name ,具体可以参考下面的例子。
一、 通常定义常量方法
我们通常利用public final static 方法定义的代码如下,分别用1 表示红灯,3 表示绿灯,2 表示黄灯。
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 方法,在该方法中返回从构造函数中传入的参数,改造后的代码如下:
package com.csdn.myEnum;
import java.util.EnumMap; import java.util.EnumSet;
public class LightTest { |
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 ); } } |
public static void main(String[] args ) {
// 1. 遍历枚举类型
Light[] allLight = Light.values ();
for (Light aLight : allLight) {
System. out .println( " 当前灯 name : " + aLight.name());
System. out .println( " 当前灯 ordinal : " + aLight.ordinal());
System. out .println( " 当前灯: " + aLight);
}
// 2. 演示 EnumMap 对象的使用
EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(
Light. class );
currEnumMap.put(Light. RED , " 红灯 " );
currEnumMap.put(Light. GREEN , " 绿灯 " );
currEnumMap.put(Light. YELLOW , " 黄灯 " );
for (Light aLight : Light.values ()) {
System. out .println( "[key=" + aLight.name() + ",value="
+ currEnumMap.get(aLight) + "]" );
}
// 3. 演示 EnmuSet 的使用
EnumSet<Light> currEnumSet = EnumSet.allOf (Light. class );
for (Light aLightSetElement : currEnumSet) {
System. out .println( " 当前 EnumSet 中数据为: " + aLightSetElement);
}
}
}当使用enum定义枚举类型时,实际上所定义出来的类型是继承自java.lang.Enum类。而每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都被默认为final。无法改变常数名称所设定的值,它们也是public和static的成员,这与接口中的常量限制相同。可以通过类名称直接使用它们。
如上所定义的枚举类型Light , RED , GREEN , YELLOW都是Light 的一个对象实例。因为是对象,所以,对象上自然有一些方法可以调用。如从Object继承的toString()方法被重新定义了,可以让你直接取得枚举值的字符串描述;values()方法可以让您取得所有的枚举成员实例,并以数组方式返回。您可以使用这两个方法来简单的将Action的枚举成员显示出来。静态valueOf()方法可以让您将指定的字符串尝试转换为枚举类型。可以用compareTo()方法来比较两个枚举对象在枚举时的顺序。-1之前,0位置相同,1之后。对于每个枚举成员,使用ordinal()方法,依枚举顺序得到位置索引,默认以0开始。