深入探讨Java枚举的实现


/*
 * 测试学习后我认识到以下几点:
 * 1、枚举基类Enum定义为 Enum<E extends Enum<E>> 只是为了对getDeclaringClass的返回值Class<E>做支持,否则定义为Enum更简单明了。
 *   呵呵,要不是认识学习了泛型定义,还真被这个定义吓到。
 * 2、编译器对枚举类处理也很简单,就是把枚举体内每个枚举值定义为static的枚举具体类的实例
 */
public class StudyEnum {

 /**
  * 测试主过程
  */
 public static void main(String[] args) {
  Week week = Week.SUN; // 正常枚举类
  MyWeek myWeek = MyWeek.SUN; // 我的模拟枚举类
 }

 // 我们在正常情况下定义的枚举类
 private enum Week {
  SUN, MON, TUE
 }

 /**
  * 我写的枚举基类,模拟JDK的Enum<E extends Enum<E>>
  */
 private static class MyEnumBase<E extends MyEnumBase<E>> {
  private final String name;

  public final String name() {
   return name;
  }

  private final int ordinal;

  public final int ordinal() {
   return ordinal;
  }

  protected MyEnumBase(String name, int ordinal) {
   this.name = name;
   this.ordinal = ordinal;
  }

  public String toString() {
   return name;
  }

  public final Class<E> getDeclaringClass() {
   Class clazz = getClass();
   Class zuper = clazz.getSuperclass();
   return (zuper == MyEnumBase.class) ? clazz : zuper;
  }

  public final int compareTo(E o) {
   MyEnumBase other = (MyEnumBase)o;
   MyEnumBase self = this;
   if (self.getClass() != other.getClass() &&
              self.getDeclaringClass() != other.getDeclaringClass())
       throw new ClassCastException();
   return self.ordinal - other.ordinal;
      }


 }

 /**
  * 枚举的具体类--星期
  * 从我写的这个具体类可以看出 Java编译器对枚举类的处理
  */
 private static class MyWeek extends MyEnumBase<MyWeek> {
  private final static MyWeek SUN = new MyWeek("SUN", 0);
  private final static MyWeek MON = new MyWeek("MON", 1);
  private final static MyWeek TUE = new MyWeek("TUE", 2);

  MyWeek(String name, int ordinal) {
   super(name, ordinal);
  }
 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值