一;关于Java Enum
Enum一般用来表示一组相同的常量。如性别、日期、月份、星期、颜色等。对这些属性用常量的好处是显而易见的,不仅可以保证单例,且比较的时候可以用”==”来替换equals.是一种好的习惯。 JDK1.5之前没有Enum这个类型,那时候一般用接口常量来替代。有了Java Enum之后,可以更贴近的表示这种常量。
API文档里Enum的构造方法:protected Enum(String name,int ordinal)单独的构造方法。程序员无法调用此构造方法。该构造方法用于由响应枚举类型声明的编译器发出的代码。
二: Java Enum的使用
注意:枚举就可以被声明为它们自己独立的类,或者被声明为类成员,但是不能在方法内声明它们。 因为枚举是一种特殊的类,因而它不仅用于列出枚举的常量值。可以为枚举添加构造函数、实例变量、方法,以及一种称为“常量特定类体“的东西。 但是绝对不能直接调用枚举的构造函数,通过在常量值后面定义的变元,会自动调用枚举构造函数。可以为构造函数定义多个变元,并且可以重载枚举构造函数,就像重载一个普通的类的构造函数一样。
简单的用法:Java Enum简单的用法是用于代表一组常用常量,可用来代表一类相同类型的常量值。如:
pubic 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 = 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.java package 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编译器帮我们做了语法的解析和编译。完全也可以自己实现。但是既然有这样方便一个东西,当然会去用了。