枚举
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这目标。
1.用普通类实现枚举功能
普通类实现枚举的要素: 私有的构造方法
每个元素分别用一个公有的静态成员变量表示
可以有若干公有方法或抽象方法。
public class WeekDayTest {
//私有化构造方法
private WeekDayTest(){}
//创建属性
public static final WeekDayTest SUN = new WeekDayTest() ;
public static final WeekDayTest MON = new WeekDayTest();
//获取下一个属性方法
public WeekDayTest nextDay() {
if(this == SUN) {
return MON;
} else {
return SUN;
}
}
@Override
public String toString() {
return this == SUN ? "SUN" : "MON";
}
}
用抽象方法实现nextDay()方法
abstract class WeekDay {
//1.私有化构造方法
private WeekDay() {}
//创建属性
public static final WeekDay SUN = new WeekDay() {
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return MON;
}
};
public static final WeekDay MON = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return SUN;
}
};
public abstract WeekDay nextDay();
@Override
public String toString() {
return this == SUN ? "SUN" : "MON";
}
}
2. 枚举的基本应用
枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象.枚举类的values,valueOf,name,toString,ordinal等方法可以使用.
枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
enum WeekDay1 {
SUN(1){
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return MON;
}
},
MON(){
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return TUE;
}
},
TUE{
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return WED ;
}
},
WED{
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return THU;
}
},
THU{
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return FRI;
}
},
FRI{
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return SAT;
}
},
SAT{
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return SUN;
}
};
WeekDay1(){
System.out.println("First");
}
private
WeekDay1(int i) {
System.out.println("Second");
}
public abstract WeekDay1 nextDay();
}
3.在枚举中创建构造方法和实现抽象类
构造方法: 构造方法必须定义成私有的
枚举元素MON和MON()的效果一样,都是调用默认的构造方法
方法: 枚举中可以有普通方法或抽象方法
抽象方法: 枚举中的抽象方法都得实现
enum TrafficLamp {
RED(30) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return GREEN;
}
},
GREEN(40) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return YELLOW;
}
},
YELLOW(5) {
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return RED;
}
};
//属性
private int time;
TrafficLamp(int time) {
this.time = time;
}
//抽象方法
public abstract TrafficLamp nextLamp();
}
枚举只有一个成员时,就可以作为一种单例的实现方式。
枚举中的一些方法
valueOf(String) 根据字符串获得枚举中相同字符的枚举常量
ordinal() 返回枚举常量的序数
getDeclaringClass() 返回与此枚举常量的枚举类型相对应的 Class 对象