最近看到Enum类的时候,发现它的定义方法很特别。关于泛型的在学习我将在另外一篇中详细描述。[url]http://xielingjiang.iteye.com/admin/blogs/870101[/url]
这句话什么意思呢?想了半天,发现它的意思就是让Enum这个类里面具有访问Enum子类的class类的能力。比如
这样它的所有子类就具有了compareTo方法,而且可以用这个方法的必须是自己同类。
当然我觉得Enum的定义开头有点绕,在自己把自己当作形参的情况下,完全可以写成:
这样就清晰了,要不然就容易看成循环
好了,我试图继承这个abstract类,但是令我惊奇的是,无论如何我都不能让编译器通过。查资料也很少提及Enum类的继承,后来我得出结论,Enum类根本就不能被继承。让我火大的是尽然这样定义成抽象类,如果定义成final类我也无话可说,唉···,误导啊。
其实我要继承Enum的初衷是要实现枚举类型的树状结构,可惜这不行。
如果我要实现一些公共的枚举类型,我非要重复写代码不可。
比如我要定义个BaseEnum,这个BaseEnum里面有这么一个公共的属性,比如int id; String name;以及他们的get/set方法和enum构造方法。如果不能实现,那我没定义个具体的Enum,我都得写上这个公共属性值和方法定义。
真是没有天理啊。。。
经过一天的研究,enum的继承只能用类继承来模拟实现了。
我的实现如下:
定义个抽象类,并且把它的构造方法定义成protected
为了能用==符号来比较,我把这个BaseEnum改装一下,如下:
定义自己的枚举类型,它继承自上面的BaseEnum,然后把它的构造方法申明为private,这样就没有人能实例化这个类了。然后在这个类中实例化几个枚举值,值的类型是自己,而且是public static final的。如下:
虽然有缺陷,每次继承的时候必须重复写private构造方法,但是毕竟是模拟的嘛。
还有,这个模拟的enum并不能实现switch,这个也是它的遗憾的地方,谁叫sun考虑不周呢。。。将就这用吧
public abstract class Enum<E extends Enum<E>>
这句话什么意思呢?想了半天,发现它的意思就是让Enum这个类里面具有访问Enum子类的class类的能力。比如
public final int compareTo(E o) {
这样它的所有子类就具有了compareTo方法,而且可以用这个方法的必须是自己同类。
当然我觉得Enum的定义开头有点绕,在自己把自己当作形参的情况下,完全可以写成:
public abstract class Enum<E extends Enum>
这样就清晰了,要不然就容易看成循环
好了,我试图继承这个abstract类,但是令我惊奇的是,无论如何我都不能让编译器通过。查资料也很少提及Enum类的继承,后来我得出结论,Enum类根本就不能被继承。让我火大的是尽然这样定义成抽象类,如果定义成final类我也无话可说,唉···,误导啊。
其实我要继承Enum的初衷是要实现枚举类型的树状结构,可惜这不行。
如果我要实现一些公共的枚举类型,我非要重复写代码不可。
比如我要定义个BaseEnum,这个BaseEnum里面有这么一个公共的属性,比如int id; String name;以及他们的get/set方法和enum构造方法。如果不能实现,那我没定义个具体的Enum,我都得写上这个公共属性值和方法定义。
真是没有天理啊。。。
经过一天的研究,enum的继承只能用类继承来模拟实现了。
我的实现如下:
定义个抽象类,并且把它的构造方法定义成protected
public abstract class BaseEnum {
protected int id;
protected String name;
protected BaseEnum(int id,String name){
this.id=id;
this.name=name;
}
}
为了能用==符号来比较,我把这个BaseEnum改装一下,如下:
public abstract class BaseEnum {
protected int id;
protected String name;
protected BaseEnum(int id,String name){
this.id=id;
this.name=name;
}
public int hashCode(){
return id;
}
public boolean equals(Object o){
if(id == (BaseEnum)o.id) return true;
else return false;
}
}
定义自己的枚举类型,它继承自上面的BaseEnum,然后把它的构造方法申明为private,这样就没有人能实例化这个类了。然后在这个类中实例化几个枚举值,值的类型是自己,而且是public static final的。如下:
public class MyEnum extends BaseEnum{
private MyEnum(int id, String name) {
super(id, name);
}
public static final MyEnum COLOR1=new MyEnum(1,"Red");
public static final MyEnum COLOR2=new MyEnum(2,"Red");
public static final MyEnum COLOR3=new MyEnum(3,"Red");
public static final MyEnum COLOR4=new MyEnum(4,"Red");
}
虽然有缺陷,每次继承的时候必须重复写private构造方法,但是毕竟是模拟的嘛。
还有,这个模拟的enum并不能实现switch,这个也是它的遗憾的地方,谁叫sun考虑不周呢。。。将就这用吧