1、为什么要有枚举
1)问题:要定义星期几或者性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但是可能会写成int weekday=0吗?
2)枚举就是要让某个类的变量取值只能为若干个固定值的一个,否则,编译器就会报错。枚举可以让编译器在编译就控制源码程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
2、用普通的Java类来实现枚举:
1)私有构造函数
2)在类的内部构造对象,并加上final Static标示,这样可以根据需要创建固定数量
对象
3)可以有若干公有或抽象方法,例如,要提供的nextWeekDay方法必须是抽象的。采用抽象方法定义nextWeekDay将大量的if.esle语句转移到了一个独立的类中了。
实现如下:
public abstract class WeekDay1 {
//1私有构造函数
private WeekDay1(){}
//2在类的内部创建不变的对象
final static WeekDay1 SUN=new WeekDay1(){
@Override
public WeekDay1 nextWeekDay() {
// TODO Auto-generated method stub
return MON;
}
};
final static WeekDay1 MON=new WeekDay1(){
@Override
public WeekDay1 nextWeekDay() {
// TODO Auto-generated method stub
return SUN;
}
};
//3抽象本类方法
abstract public WeekDay1 nextWeekDay();
//4 打印日期
@Override
public String toString() {
// TODO Auto-generated method stub
return this==MON?"MON":"SUN";
}
}
3、创建一个枚举类
1)枚举就相当于一个类,其中也可以定义构造函数、成员变量、普通方法和抽象方法。
2)枚举元素必须位于枚举体重的最开始部分,枚举元素列表的后要有分号与其成员分隔。把枚举中的成员放在枚举元素的签名,编译器就会报错。
3)带构造方法的枚举
①构造方法必须定义成私有的private
②如果有多个构造方法,该如何选择哪个构造方法?
③枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
4)带方法的枚举
②定义枚举TrafficLamp
②实现普通的next方法
③实现抽象的next方法:每个元素 分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。
5)增加上表示时间的构造方法。
6)枚举只有一个成员时,就可以作为一种单例的实现方式。
而枚举类如下:
public enum TrafficLamp{
RED(30){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return GREEN;
}
},
GREEN(45){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return YELLOW;
}
},
YELLOW(5){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp (int time){this.time=time;};
}