Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型。枚举类型的定义也非常的简单,用 enum 关键字加上名称和大括号包含起来的枚举值体即可,例如上面提到的彩虹颜色就可以用新的 enum 方式来重新定义:
enum RainbowColor { RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, PURPLE }
从上面的定义形式来看,似乎 Java 中的枚举类型很简单,但实际上 Java 语言规范赋予枚举类型的功能非常的强大,它不仅是简单地将整形数值转换成对象,而是将枚举类型定义转变成一个完整功能的类定义。这种类型定义的扩展允许开发者给枚举类型增加任何方法和属性,也可以实现任意的接口。
enum扩大了 switch 语句使用范围。5.0 之前,Java 中 switch 的值只能够是简单类型,比如 int、long、char, 有了枚举类型之后,就可以使用对象了。这样一来,程序的控制选择就变得更加的方便,看下面的例子:
// 定义一周七天的枚举类型 public enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun } // 读取当天的信息 WeekDayEnum today = readToday(); // 根据日期来选择进行活动 switch(today) { Mon: do something; break; Tue: do something; break; Wed: do something; break; Thu: do something; break; Fri: do something; break; Sat: play sports game; break; Sun: have a rest; break; }
对于这些枚举的日期,JVM 都会在运行期构造成出一个简单的对象实例一一对应。这些对象都有唯一的 identity,类似整形数值一样,switch
语句就根据此来进行执行跳转。
除了最常见的枚举定义形式外,如果需要给枚举类型增加一些复杂功能,也可以通过类似 class 的定义来给枚举进行定制。比如要给 enum 类型增加属性、添加构造方法或抽象方法,
package heima; public class EnumTest { public static void main(String[] args) { TrafficLamp ww = TrafficLamp.RED; System.out.println(ww);//枚举自动实现了toString方法 System.out.println(ww.time);//红灯时长 System.out.println(ww.nextLamp());//下一个等的颜色 } public enum TrafficLamp {//枚举也是一个类,可以有子类,也有默认构造方法 RED(30){// 调用父类的有参的构造方法创建一个子类的实例,由匿名内部类创建子类,,并构建新的方法 public TrafficLamp nextLamp() {//重写父类的抽象方法, return GREEN; }; }, GREEN(30){ public TrafficLamp nextLamp() { return YELLOW; }; }, YELLOW(5){ public TrafficLamp nextLamp() { return RED; }; }; private int time; private TrafficLamp(int time){//定义有参的构造方法,增加参数时间 this.time= time; } public abstract TrafficLamp nextLamp() ; } }
不过在使用 Enum 时候有几个地方需要注意:
原文:http://www.cnblogs.com/hansheng1988/p/3726447.html