java1.5新特性之枚举总结

时间:2023-01-21 12:07:55


这里说的枚举不是Enumeration.  Enumeration是Vector集合中的迭代器,并且已经被Iterator取代.

枚举相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。那么为什么要用枚举不直接用普通的类?

在枚举当中声明的所有元素默认都是public static final修饰(当然,不需要也不允许显示的写出来.枚举的元素前面不能有任何修饰符),并且枚举的构造函数一定要是私有的.

枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。枚举的元素一定要位于枚举体的最前面,否则编译不通过.枚举只有一元素时,就可以作为一种单例的实现方式。 
例如一个类用来描述交通信号灯,信号灯的颜色已经固定了,只能是红,黄,绿.这时就可以用枚举来实现.
public class EnumTest
{

public static void main(String[] args)
{
TrafficLamp lamp1=TrafficLamp.RED;//用类名去调用静态成员一样的方式.
TrafficLamp lamp2=TrafficLamp.YELLOW;

System.out.println(lamp1.nextLamp());//GREEN

lamp1.setTime(60);//经测试 这个time属性是可以改的,虽然枚举元素中写的是RED(50)
System.out.println(lamp1.getTime());//50改成了60

System.out.println(lamp2.getTime());//YELLOW调用的空参构造方法,这里返回为0


System.out.println(lamp1.name());//RED 返回此枚举常量的名称
System.out.println(lamp1.toString());//RED 更推荐使用这个方法,必要时可以重写

System.out.println(lamp2.ordinal());//返回枚举常量的序数,经测试就是出现的顺序,从0开始.YELLOW的序数是2.

//valueOf()这个静态方法我对着API看了半天最终确定 返回的是个枚举的对象...
//而且 写成Trafficlamp.valueOf("GREEN") 结果一样.....
System.out.println(TrafficLamp.valueOf(TrafficLamp.class,"GREEN").nextLamp());//YELLOW

TrafficLamp[] lamps = TrafficLamp.values (); //values() 方法返回的是枚举类所有的元素集合
for(TrafficLamp lamp:lamps)
{
System.out.print(lamp);//不用name()方法也可以直接打印出来....
}
}
public enum TrafficLamp
{
RED(50)//每个元素就是枚举的一个子类实例对象.用匿名内部类的方式定义.一定要写在最前面.
{
public TrafficLamp nextLamp()
{
return GREEN;
}
},
GREEN(40)
{
public TrafficLamp nextLamp()
{
return YELLOW;
}
},
YELLOW()//这里调用的就是空参的构造方法.
{
public TrafficLamp nextLamp()
{
return RED;
}
};
private int time;
abstract TrafficLamp nextLamp();//抽象方法
TrafficLamp(){}//空参构造方法
TrafficLamp(int time)
{
this.time=time;
}

public int getTime()
{
return time;
}
public void setTime(int time)
{
this.time = time;
}
}

}