/*
* 测试学习后我认识到以下几点:
* 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);
}
}
}