当前位置: 代码迷 >> 综合 >> JAVA ENUM枚举总结
  详细解决方案

JAVA ENUM枚举总结

热度:81   发布时间:2023-10-28 01:12:04.0

原理分析(转)

        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);}