本帖最后由 赵玮_Tom 于 2012-5-7 09:20 编辑
其实张老师讲的已经很清楚了。
枚举是jdk1.5的新特性。所谓枚举,就是你自定义的一种数据类型,这种类型只能在某个区间内取值(如交通灯的取值只能为红、绿、黄三种),超出取值区间,编译报错(如果不用枚举类型,错误有可能出现在运行时期)。
1)枚举用关键字enum来标记。
2)枚举的构造方法只能私有。
3)枚举的每个元素其实都是该枚举类的一个实例对象。
4)枚举元素类表要放在枚举类的最前面(构造方法、变量等都有放在枚举元素类表的后面)。
5)枚举可以有带参数的构造方法,如果枚举元素采用带参数的构造方法实例化,要调用该参数。
6)枚举可以有抽象方法,每个元素须覆写该方法。
7)单例模式也可以用只有一个元素的枚举来实现。
举例如下(其实也是张老师的例子WeekDay):
如果用一般的类来实现枚举功能,是这样的:- public abstract class WeekDay1
- {
- private WeekDay1(){};//私有构造方法
- //在类内部创建多个子类实例对象,并覆写类中抽象方法(此处采用的是匿名内部类方式)
- public static final WeekDay1 SUN = new WeekDay1()
- {
- public WeekDay1 nextDay()
- {
- return MON;
- }
- };
- public static final WeekDay1 MON = new WeekDay1()
- {
- public WeekDay1 nextDay()
- {
- return TEU;
- }
- };
- public static final WeekDay1 TEU = new WeekDay1()
- {
- public WeekDay1 nextDay()
- {
- return WED;
- }
- };
- public static final WeekDay1 WED = new WeekDay1()
- {
- public WeekDay1 nextDay()
- {
- return THU;
- }
- };
- public static final WeekDay1 THU = new WeekDay1()
- {
- public WeekDay1 nextDay()
- {
- return FRI;
- }
- };
- public static final WeekDay1 FRI = new WeekDay1()
- {
- public WeekDay1 nextDay()
- {
- return SAT;
- }
- };
- public static final WeekDay1 SAT = new WeekDay1()
- {
- public WeekDay1 nextDay()
- {
- return SUN;
- }
- };
- public abstract WeekDay1 nextDay();
- //toString方法
- public String toString()
- {
- if(this==SUN)
- return "SUN";
- else if(this==MON)
- return "MON";
- else if(this==TEU)
- return "TEU";
- else if(this==WED)
- return "WED";
- else if(this==THU)
- return "THU";
- else if(this==FRI)
- return "FRI";
- else
- return "SAT";
- }
- }
复制代码 实现统一的功能,枚举的实现方式是:- public enum WeekDay
- {
- //枚举中元素列表必须位于所有内容之前,并覆写抽象方法
- SUN(0)
- {
- public WeekDay nextDay()
- {
- return MON;
- }
- },
- MON(1)
- {
- public WeekDay nextDay()
- {
- return TEU;
- }
- },
- TEU(2)
- {
- public WeekDay nextDay()
- {
- return WED;
- }
- },
- WED(3)
- {
- public WeekDay nextDay()
- {
- return THU;
- }
- },
- THU(4)
- {
- public WeekDay nextDay()
- {
- return FRI;
- }
- },
- FRI(5)
- {
- public WeekDay nextDay()
- {
- return SAT;
- }
- },
- SAT(6)
- {
- public WeekDay nextDay()
- {
- return SUN;
- }
- };
- private int day;
- //私有构造方法
- private WeekDay(int day)
- {
- this.day = day;
- };
- //定义抽象方法
- public abstract WeekDay nextDay();
- }
复制代码 值得一提的是:API中提供了对枚举的支持,可以在API中查找到用于直接操作枚举的方法(如ordinal(), valueOf()等)。这样的话,采用枚举类比一般类的方式要更加简便,安全性更高。
|