为什么要有枚举?
- 问题:要定义星期几或者性别的变量,该怎么定义,假设用1-7分别表示星期一到星期日。但有人可能会写成int weekday = 0;
- 枚举就是要让某个类型的变量的取值只能为若干个固定的值中的一个,否则,编译器就报错误。枚举可以让编译器在编译时就可以控制源程序中的填写的非法值,普通变量的方式在开发阶段无法实现这一目标
所以枚举的优点;编译源程序的时候就可以发现你写的程序合法不合法,起到检验的作用
用普通类实现枚举的功能
1. 私有构造方法
2. 每个元素分别用一个共有的静态成员变量表示
3. 可以有若干个公有方法或抽象方法例如nextDay()方法必须是抽象的,采用抽象方法定义就是可以将if。。。else语句转换成一个个独立的类
枚举的基本应用
l 举例:定义一个Weekday的枚举
l 扩展:枚举类的values,valueof.name.toString.ordinal等方法
l 总结:枚举是一个特殊的类,其中的每一个元素都是该类的实例对象
普通类实现枚举
package lxl.test;
/**
* 用普通类模拟枚举类
* @author Administrator
*
*/
public abstract class WeekDay1 {
private WeekDay1(){}
public static final WeekDay1 SUN= new WeekDay1(){
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return MON;
}
};
public static final WeekDay1 MON= new WeekDay1(){
@Override
public WeekDay1 nextDay() {
// TODO Auto-generated method stub
return SUN;
}
};
public abstract WeekDay1 nextDay();
/* public Weekday nextDay(){
if(this == SUN)
return MON;
else
return SUN;
}*/
public String toString() {
return this==SUN?"SUN":"MON";
}
}
l 枚举就相当于一个类,其中也可以定义构造方法,成员变量,普通方法和抽象方法
l 枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后面要有分号与其他成员分隔,把枚举中的成员方法或者变量等放在枚举元素的前面,编译器报告错误。
l 带构造方法的枚举
1. 构造方法必须定义成私有的
2. 如果有多个构造方法该如何选择那个构造方法呢?
3. 枚举元素MON和MON()的效果一样,都是调用默认的构造方法。
l 带方法的枚举
1. 定义枚举TrafficLamp
2. 实现普通的next方法
3. 定义抽象的next方法:每个元素分别是由枚举类的子类生成的实例对象,这些子类采用类似内部类的方式进行定义。
4. 增加表示时间的构造方法
枚举例子:
/**
* 枚举测试
* @author Administrator
*
*/
public class EnumTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
WeekDay1 weekday = WeekDay1.SUN ;
System.out.println(weekday.nextDay());
WeekDay weekDay = WeekDay.FRI;
System.out.println(weekDay);
System.out.println(weekDay.name());
System.out.println(weekDay.ordinal());
//把一个String编程一个枚举对象
System.out.println(WeekDay.valueOf("SUN"));
//values()方法返回一个数组
System.out.println(WeekDay.values().length);
TrafficLamp tl = TrafficLamp.RED;
System.out.println(tl);
System.out.println(tl.nextLamp());
}
/**
* 枚举 Enum
* @author Administrator
*
*/
public enum WeekDay{
//元素列表
SUN(0),MON(),TUE,WED,THI,FRI,STA;//元素列表之后如果有东西就必须有";"。没有可省略
//元素列列表中的元素初始化调用对应的构造方法
private WeekDay(){System.out.println("无参数构造方法");};
private WeekDay(int day){System.out.println("带参数的构造方法");};
}
/**
* 交通灯,,比较复杂的枚举
* @author Administrator
*
*/
public enum TrafficLamp{
//初始化红、黄、绿灯
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},GREEN(45){
public TrafficLamp nextLamp(){
return YELLOW;
}
},YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
private int time;
private TrafficLamp(int time) {
this.time = time;
}
public abstract TrafficLamp nextLamp();
}
}
如果枚举只有一个成员,就可以作为一个单例的实现方式