------- android培训、java培训、期待与您交流! ----------
枚举
JDK1.5引入了新的类型——枚举。
为什么要有枚举:
问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday=0;
枚举就是要让某个类型的变量的取值只能为固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举的功能。
私有的构造方法
每个元素分别用一个公有的静态成员变量表示
可以有若干个公有的方法或抽象方法,例如,要提供nextDay方法必须是抽象的。
public abstract class WeekDay1 {
privateWeekDay1(){}//私有的构造方法
//公有的静态成员变量,父类的引用指向具体的子类对象
publicfinal static WeekDay1 SUN = new WeekDay1(){//内部类,并且是WeekDay1的子类
//实现WeekDay1中的抽象方法
publicWeekDay1 nextDay() {
returnMON;
}
};
//公有的静态成员变量,父类的引用指向具体的子类对象
publicfinal static WeekDay1 MON = new WeekDay1(){//内部类,并且是WeekDay1的子类
//实现WeekDay1中的抽象方法
publicWeekDay1 nextDay() {
returnSUN;
}
};
//实现WeekDay1中的抽象方法
publicabstract WeekDay1 nextDay();//定义抽象方法
}
枚举的应用
场景1:比较复杂的枚举事例:
enum WeekDay{
SUN {//内部类,继承WeekDay并实现getNetday抽象方法
@Override
WeekDay getNetday() {
//TODO Auto-generatedmethod stub
returnthis.MON;
}
},MON(1) {//创建该枚举实例时会调用带参数的构造函数,对其进行初始化
@Override
WeekDay getNetday() {
//TODO Auto-generatedmethod stub
returnthis.SAT;
}
},SAT {
@Override
WeekDay getNetday() {
//TODO Auto-generatedmethod stub
returnthis.SUN;
}
};
private WeekDay(){}//私有的无参构造函数
private WeekDay(int day){}//私有的有参构造函数
abstract WeekDay getNetday();//枚举中定义一个抽象方法,具体由子类去实现
}
场景2:当枚举中的元素只有一个时,可以当作单例模式来使用
enum WeekDay{
SUN;
private WeekDay(){
System.out.println();
}//私有的无参构造函数
}
1、 在JDK1.5 之前,我们定义常量都是: publicstaticfianl,有了枚举,我们可以定义一个有意义的枚举,元素当作常量来使用,并且是一个集合,表示的意义也就更多,枚举还提供了比常量更多的方法。
//定义一个最简单的枚举,元素有 MON,SUM,THU,
public enum Weekday {
MON,SUM,THU//元素当作常量来使用,通过Weekday.元素名的方式来获取元素,元素是指向本枚举实例的引用
}
2、 使用枚举,能让我们的代码可读性更强。由于枚举是我们主观意识定义的,用来表示生活中的一些集合体,因此枚举本身具备很强的可读性。
enum Signal {
//用枚举来表示交通灯,GREEN表示绿灯, YELLOW表示红灯, RED表示绿灯
GREEN, YELLOW, RED
}
public class TrafficLight {
Signal color = Signal.RED;// color表示当前交通灯的颜色
public void change() {
//结合switch语句,操作起来更加方便
switch (color) {
case RED:
color = Signal.GREEN;//红灯转绿灯
break;
case YELLOW:
color = Signal.RED;//黄灯转红灯
break;
case GREEN:
color = Signal.YELLOW;//绿灯转黄灯
break;
}
}
}
3、在枚举中定义自定义方法,并且必须在枚举实例序列的最后添加分号和定义在枚举实例后面。
publicenumColor {
RED("红色", 1), GREEN("绿色", 2),BLANK("白色", 3),YELLO("黄色", 4);
//成员变量
private Stringname;
privateintindex;
//构造方法
private Color(String name,int index) {
this.name = name;
this.index = index;
}
//普通方法
publicstatic String getName(int index) {
for (Color c : Color.values()) {
if (c.getIndex() == index) {
return c.name;
}
}
returnnull;
}
// get set方法
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
publicint getIndex() {
returnindex;
}
publicvoid setIndex(int index) {
this.index = index;
}
}
4、 覆盖枚举toString方法。
publicenumColor {
RED,GREEN,YELLO;
//覆盖方法
@Override
public String toString() {
returnthis.index+"_"+this.name;
}
}
5、 实现接口
publicinterfaceBehaviour {
void print();
String getInfo();
}
publicenumColorimplements Behaviour{
RED("红色", 1), GREEN("绿色", 2),BLANK("白色", 3),YELLO("黄色", 4);
//成员变量
private Stringname;
privateintindex;
//构造方法
private Color(String name,int index) {
this.name = name;
this.index = index;
}
//接口方法
@Override
public String getInfo() {
returnthis.name;
}
//接口方法
@Override
publicvoid print() {
System.out.println(this.index+":"+this.name);
}
}