原理分析(转)
enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>。EnumTest 经过反编译(javap com.hmw.test.EnumTest 命令)之后得到的内容如下:
public
class
com.hmw.test.EnumTest
extends
java.lang.Enum{
public
static
final
com.hmw.test.EnumTest MON;
public
static
final
com.hmw.test.EnumTest TUE;
public
static
final
com.hmw.test.EnumTest WED;
public
static
final
com.hmw.test.EnumTest THU;
public
static
final
com.hmw.test.EnumTest FRI;
public
static
final
com.hmw.test.EnumTest SAT;
public
static
final
com.hmw.test.EnumTest SUN;
static
{};
public
int
getValue();
public
boolean
isRest();
public
static
com.hmw.test.EnumTest[] values();
public
static
com.hmw.test.EnumTest valueOf(java.lang.String);
com.hmw.test.EnumTest(java.lang.String,
int
,
int
, com.hmw.test.EnumTest);
}
|
所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。
语法(定义)(转)
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
package
com.hmw.test;
/**
* 枚举测试类
* @author <a href="mailto:hemingwang0902@126.com">何明旺</a>
*/
public
enum
EnumTest {
MON, TUE, WED, THU, FRI, SAT, SUN;
}
|
这段代码实际上调用了7次 Enum(String name, int ordinal):
new
Enum<EnumTest>(
"MON"
,
0
);
new
Enum<EnumTest>(
"TUE"
,
1
);
new
Enum<EnumTest>(
"WED"
,
2
);
... ...
|
/** 很危险,如果添加假期,而没有添加switch,可以编译,但假期计算会按照普通的日期计算*/
public enum salary {MONDAY,TUESDAY,WEDNESDAY,THURSDDAY,FRIDAY,SATURDAY,SUNDAY;private static final int HUORS=8;double pay(double hourWorked,double payRate){double basepay=hourWorked*payRate;double overtimepay;switch(this){case SATURDAY: case SUNDAY:overtimepay=hourWorked*payRate/2;default:overtimepay=hourWorked<=HUORS?0:(hourWorked-HUORS)*payRate/2;break;}return basepay+overtimepay;}}
/** 可以添加私有的嵌套枚举,解决该问题*/
enum salary1{MONDAY(Cal.weekday),TUESDAY(Cal.weekday),WEDNESDAY(Cal.weekday),THURSDDAY(Cal.weekday),FRIDAY(Cal.weekday),SATURDAY(Cal.weekend),SUNDAY(Cal.weekend);private final Cal cal;salary1(Cal cal){this.cal=cal;}double pay(double hourWorked, double payRate){return cal.pay(hourWorked, payRate);}private enum Cal {weekday {@Overridedouble overtimepay(double hourWorked, double payRate) {return hourWorked<=HOURS?0:(hourWorked-HOURS)*payRate/2;}},weekend {@Overridedouble overtimepay(double hourWorked, double payRate) {// TODO Auto-generated method stubreturn hourWorked*payRate/2;}};private static final int HOURS=8;abstract double overtimepay(double hourWorked,double payRate);double pay(double hourWorked,double payRate){double basepay=hourWorked+payRate;return basepay+overtimepay(hourWorked, payRate);}}
}enum Operation{PLUS {@Overridedouble apply(double x, double y) {return x+y;}},MINUS {@Overridedouble apply(double x, double y) {return x-y;}};abstract double apply(double x,double y);}