一;关于Java Enum

Enum一般用来表示一组相同的常量。如性别、日期、月份、星期、颜色等。对这些属性用常量的好处是显而易见的,不仅可以保证单例,且比较的时候可以用”==”来替换equals.是一种好的习惯。 JDK1.5之前没有Enum这个类型,那时候一般用接口常量来替代。有了Java Enum之后,可以更贴近的表示这种常量。

API文档里Enum的构造方法:protected Enum(String name,int ordinal)单独的构造方法。程序员无法调用此构造方法。该构造方法用于由响应枚举类型声明的编译器发出的代码。

二: Java Enum的使用

注意:枚举就可以被声明为它们自己独立的类,或者被声明为类成员,但是不能在方法内声明它们。  因为枚举是一种特殊的类,因而它不仅用于列出枚举的常量值。可以为枚举添加构造函数、实例变量、方法,以及一种称为“常量特定类体“的东西。 但是绝对不能直接调用枚举的构造函数,通过在常量值后面定义的变元,会自动调用枚举构造函数。可以为构造函数定义多个变元,并且可以重载枚举构造函数,就像重载一个普通的类的构造函数一样。

简单的用法:Java Enum简单的用法是用于代表一组常用常量,可用来代表一类相同类型的常量值。如:

enumSexEnum {  male,female; }  // 且枚举常量一定要放在开头,并且以 ;结束

枚举对象里面的枚举值必须是唯一的,可以通过Enum类型名直接引用该常量,如 sexEnum.male, sexEnum.female.

复杂用法:Java为枚举类型提供了一些内置的方法,同时枚举常量还可以有自己的方法。可以很方便的枚举对象,如下例所示:

三:实例代码


代码一: WeekDay.java

package liao.qianwen.test;
public  enum WeekDay
   Mon("Mondy"),Tue("Tuesday"),Wen("Wensday"),Thu("Thursday"),Fri("Friday"),Sat("Saturday"),Sun("Sunday");
   private  final String day;
   private WeekDay(String day){
      this.day
   }
   public  static void printDay(int i) {
      switch(i) {
      case 1:
         System.out.println(WeekDay.Mon);break;
      case 2:
         System.out.println(WeekDay.Tue);break;
      case 3:
         System.out.println(WeekDay.Wen);break;
      case 4:
         System.out.println(WeekDay.Thu);break;
      case 5:
         System.out.println(WeekDay.Fri);break;
      case 6:
         System.out.println(WeekDay.Sat);break;
      case 7:
         System.out.println(WeekDay.Sun);break;
      }
   }
   public  String getDay() {
      return  day;
   }
}

代码二:


testEnum.javapackage liao.qianwen.test;public class testEnum {    public static void main(String[] args) {       for(WeekDay day: WeekDay.values()) {          System.out.println(day +"=====>"+day.getDay());       }       WeekDay.printDay(5);    }}



在cmd中到该类的目录下,非包目录。然后执行: javap 枚举名



E:\zllab\workspace\wenTest\bin>javap liao/qianwen/test.WeekDay
Compiled from "WeekDay.java"
public final class liao.qianwen.test.WeekDay extends java.lang.Enum{
    public static final liao.qianwen.test.WeekDay Mon;
    public static final liao.qianwen.test.WeekDay Tue;
    public static final liao.qianwen.test.WeekDay Wen;
    public static final liao.qianwen.test.WeekDay Thu;
    public static final liao.qianwen.test.WeekDay Fri;
    public static final liao.qianwen.test.WeekDay Sat;
    public static final liao.qianwen.test.WeekDay Sun;
    static {};
    public static void printDay(int);
    public java.lang.String getDay();
    public static liao.qianwen.test.WeekDay[] values();
    public static liao.qianwen.test.WeekDay valueOf(java.lang.String);
}

虽然在Java的ApI文档中Enum类没有显示有Values()方法,也许这就是Enum类和enum关键字的不同之处。但是通过反编译,可以得出以下信息:

l 1 .WeekDay是Enum的子类(可以很清楚的看到,其实JVM是将enum变成一个继承Enum的类,他进行了一系列的操作。

l  2.枚举常量是以publicstatic final 类常量的形式实现的。

l 3. 编译器自动生成了values()和valueof()方法

 所以实际上Enum类型就是以Java类来实现的,没有什么新的特点,只不过java编译器帮我们做了语法的解析和编译。完全也可以自己实现。但是既然有这样方便一个东西,当然会去用了。