jdk1.5新特性--枚举。
为什么要有枚举?
问题:需要定义星期或性别,该怎么定义呢?假设星期定义为0-7,但是有的人可能更钟情于0-6。这样没有统一的规范,容易在运行时出错。
枚举就是为了解决这个问题而出现的,枚举就是让某一个变量的取值只能为若干个固定值中的一个,否则编译器报错,枚举可以实现在编译阶段控制源程序的非法输入。
枚举只有一个成员时,可以作为单例的一种 实现方式。
下面用模似一个枚举类
<span style="font-size:18px;"><span style="font-size:18px;">package demo;
//模拟枚举
public abstract class WeekDay {
public final static WeekDay SUN=new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return MON;
}
};
public final static 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==MON?"星期日":"星期一";
}
}</span></span>
<span style="font-size:18px;">package demo;
public class EnumTest {
/**
* @param args
*/
public static void main(String[] args) {
WeekDay weekDay=WeekDay.MON;//固定范围取值。只能是其实例对象.
System.out.println(weekDay);//星期日
System.out.println(weekDay.nextDay());//星期一
System.out.println("***enum method***");
WeekDay2 weekDay2=WeekDay2.SAT;
System.out.println(weekDay2.name());
System.out.println(weekDay2.ordinal());//得到此枚举实例的序列
System.out.println("***enum static method***");
System.out.println(WeekDay2.valueOf("MON"));//将字符串转成WeekDay2
System.out.println(WeekDay2.values().length);//得到此枚举的所有元素,数组来的。打印长度得了。
}
/*
* java已经封装了“枚举”,直接用就可以 了,
* 下面来看看枚举的简单应用,
*/
public enum WeekDay2{
SUN(),MON(),WED(),THU,FRI,SAT;
}
/*
* 有构造 方法的枚举。
*/
public enum WeekDay3{
SUN(1),MON(),WED(),THU(),FRI(),SAT();//sun调用的是带参数的构造 方法。
//构造方法必须是私有的。
//构造方法必须必须定义在实例后面。
private WeekDay3()
{
System.out.println("first...");
}
private WeekDay3(int day)
{
System.out.println("second...");
}
}
/*
* 较复杂的一个枚举。
* 带抽象方法
* 带构造方法。
* 交通灯:TrafficLamp</span>
<span style="font-size:18px;"> */
public enum TrafficLamp
{
//new Date(){},new的是Date的子类对象,调用父类的空参数构造方法
//new Date(12){},new 的是Date的子类对象,调用的是父类有参构造方法。
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(10){
@Override
public TrafficLamp nextLamp() {
// TODO Auto-generated method stub
return RED;
}
};
public abstract TrafficLamp nextLamp();
private TrafficLamp(int time){
this.time=time;
}
private int time;
}
}</span>