枚举:

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 时候有几个地方需要注意:

  1. enum 类型不支持 public 和 protected 修饰符的构造方法,因此构造函数一定要是 private 或 friendly 的。也正因为如此,所以枚举对象是无法在程序中通过直接调用其构造方法来初始化的。
  2. 定义 enum 类型时候,如果是简单类型,那么最后一个枚举值后不用跟任何一个符号;但如果有定制方法,那么最后一个枚举值与后面代码要用分号';'隔开,不能用逗号或空格。
  3. 由于 enum 类型的值实际上是通过运行期构造出对象来表示的,所以在 cluster 环境下,每个虚拟机都会构造出一个同义的枚举对象。因而在做比较操作时候就需要注意,如果直接通过使用等号 ( ‘ == ’ ) 操作符,这些看似一样的枚举值一定不相等,因为这不是同一个对象实例。