枚举的作用:让某个类型的变量的取值只能为若干个固定值中的一个。
假设有这样的需求,有程序里定义一个星期类,取值只能为周一或周日
用普通类实现代码:
public class Weekday{
public final static Weekday SUN = new Weekday();
public final static Weekday MON = new Weekday();
private Weekday(){}
}
用枚举实现代码:
public enum Weekday2{
SUN, MON;
}
调用示例:
Weekday weekday = Weekday.MON;
Weekday2 weekday2 = Weekday2. MON;
可以看出,使用枚举的代码量比较少,还可以让编译器在编译时就可以控制源程序中填写的非法值。另外,枚举类还有values,valueOf,name,toString,ordinal等非常方便地方法,可以查看JDK文档获知其用法。
再分享一个面试题:
定义一个交通灯枚举,包含红灯、绿灯、黄灯,需要有获得下一个灯的方法; 例如:红灯获取下一个灯是绿灯,绿灯获取下一个灯是黄灯。
代码如下:
public enum TrafficLamp {
/**
* 每个元素分别是由枚举类的子类来生成的实例对象,这些子类采用类似内部类的方式进行定义。
*/
RED(45) {
public TrafficLamp nextLamp() {
//红灯下一个返回绿灯
return GREEN;
}
},
GREEN(50) {
public TrafficLamp nextLamp() {
//绿灯下一个返回黄灯
return YELLOW;
}
},
YELLOW(5) {
public TrafficLamp nextLamp() {
//黄灯下一个返回红灯
return RED;
}
};
/**
* 枚举可以看作是一个类,内部也可以定义构造方法、成员变量、普通方法和抽象方法。 枚举中的成员方法或变量等必须放在枚举元素的后面
* 该抽象方法获取下一个灯的对象
*
* @return 下一个交通灯的实例
*/
public abstract TrafficLamp nextLamp();
//灯的显示时长
private int time;
/**
* 采用构造函数的方法初始化变量,枚举内的构造函数必须是私有的。
* @param time 灯的显示时长
*/
private TrafficLamp( int time){
this. time = time;
}
}
另外,枚举还可以用来定义单例
首先了解一下实现单例的方法
实现单例模式的三个步骤(饿汉式):
1.私有化空参数的构造函数,不让通过new的方式创建出来这个类的对象
2.在类中定义一个该类自己类型的变量,设定为静态的,并new出来引用的对象
3.在类中定义一个静态的方法,方法返回第2步定义的对象,方法名一般为newInstance
示例代码:
public class Singleton {
private Singleton() {
}
private static final Singleton single = new Singleton ();
public static Singleton getInstance() {
return single;
}
}
然而使用枚举的话,实现方式是只在枚举里设定一个成员即可,非常方便简单。
这是因为枚举就是一个特殊的类,默认已有一个私有的不带参数的构造函数,其中的枚举元素都是该类的一个实例对象。
示例代码:
public enum Singleton {
single;
}
是不是简单好多?
总结:枚举作为jdk5.0出的新特性,用来处理有限、稳定的数据集是非常方便地,比如一周、四季这样的。如此简单轻巧,又体现出不一样的编程思想,何乐而不为呢?