---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
一、枚举的作用
1,问题的由来
要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。因此需要一种机制对这种类型的变量进行限制,使变量的取值只能为若干个固定值中的一个,这样就避免了错误的发生,而枚举的出现解决了这方面的问题。
2,枚举的理解
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
因而可以总结为枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象。
二、用普通的类模拟枚举类
1,定义一个枚举类MyWeekday
public class MyWeekDay {
private MyWeekDay(){}
public static final MyWeekDay SUN = new MyWeekDay();
public static final MyWeekDay MON = new MyWeekDay();
public static final MyWeekDay TUE = new MyWeekDay();
public static final MyWeekDay WED = new MyWeekDay();
public static final MyWeekDay THI = new MyWeekDay();
public static final MyWeekDay FRI = new MyWeekDay();
public static final MyWeekDay SAT = new MyWeekDay();
public MyWeekDay nextDay(){
if(this == SUN)
return MON;
else if(this == MON)
return TUE;
else if(this == MON)
return TUE;
else if(this == TUE)
return WED;
else if(this == WED)
return THI;
else if(this == THI)
return FRI;
else if(this == FRI)
return SAT;
else
return SUN;
}
public String toString(){
if(this == SUN)
return "SUN";
else if(this == MON)
return "MON";
else if(this == TUE)
return "TUE";
else if(this == WED)
return "WED";
else if(this == THI)
return "THI";
else if(this == FRI)
return "FRI";
else
return "SAT";
}
}
2,定义一个类EumerationTest,当我们在使用MyWeekDay时只能使用其预先定义的数据,即采用类名调用的方式。下面程序使用MyWeekDay时,将星期定义为FRI,当调用nextDay方法时返回下一天,打印SAT
public class EumerationTest {
public static void main(String[] args) {
MyWeekDay weekDay = MyWeekDay.FRI;
System.out.println(weekDay.nextDay());
}
}
3,总结利用普通类模拟枚举类的步骤
3.1,将类的构造函数私有,外部使用者不能创建对象
3.2,创建若干本类对象,供为外部使用者使用,对象声明为public,static,final。
3.3,可以根据需求为枚举类定义若干方法。
4,MyWeekDay中nextDay方法存在大量if-else语句,可通过内名内部类的形式将其转移到每个子类实例中,那么可将该方法声明为抽象,让子类实现,将MyWeekDay声明为抽象类。
public abstract class MyWeekDay {
private MyWeekDay(){}
public static final MyWeekDay SUN = new MyWeekDay(){
@Override
public MyWeekDay nextDay() {
// TODO Auto-generated method stub
return MON;
}
};
public static final MyWeekDay MON = new MyWeekDay(){
@Override
public MyWeekDay nextDay() {
// TODO Auto-generated method stub
return TUE;
}
};
public static final MyWeekDay TUE = new MyWeekDay(){
@Override
public MyWeekDay nextDay() {
// TODO Auto-generated method stub
return WED;
}
};
public static final MyWeekDay WED = new MyWeekDay(){
@Override
public MyWeekDay nextDay() {
// TODO Auto-generated method stub
return THI;
}
};
public static final MyWeekDay THI = new MyWeekDay(){
@Override
public MyWeekDay nextDay() {
// TODO Auto-generated method stub
return FRI;
}
};
public static final MyWeekDay FRI = new MyWeekDay(){
@Override
public MyWeekDay nextDay() {
// TODO Auto-generated method stub
return SAT;
}
};
public static final MyWeekDay SAT = new MyWeekDay(){
@Override
public MyWeekDay nextDay() {
// TODO Auto-generated method stub
return SUN;
}
};
public abstract MyWeekDay nextDay();
public String toString(){
if(this == SUN)
return "SUN";
else if(this == MON)
return "MON";
else if(this == TUE)
return "TUE";
else if(this == WED)
return "WED";
else if(this == THI)
return "THI";
else if(this == FRI)
return "FRI";
else
return "SAT";
}
}
三、利用enum关键字定义枚举
1,定义枚举类注意事项
1.1,定义的枚举类元素应用分号分隔开来,且定义的元素应在枚举类最前面,即定义的元素前面不能有内容
1.2,当枚举类中定义其它内容时,最后的元素结尾处应以分号结束
2,枚举类示例WeekDay
public enum WeekDay {
SUN,MON,TUE,WED,THI,FRI,SAT;
}
WeekDay wDay = WeekDay.FRI;
System.out.println(wDay.ordinal());//打印5,
四、实现带有构造函数的枚举类
1,构造函数放在所有成员之后
2,构造函数声明为private
public enum WeekDay {
SUN(1),MON,TUE,WED,THI,FRI,SAT;
private WeekDay(){
System.out.println("first");
}
private WeekDay(int i){
System.out.println("second");
}
}
Weekday提供了两个构造函数,和普通的类的构造函数一样,会为相应的对象进行初始化,当使用Weekday时,会打SUN对象会调用WeekDay(int i)这个构造函数打印second,而其它的对象会调用WeekDay()打印first。
五、实现带有抽象方法的枚举
实现带有抽象方法的枚举可以从以下几方面着手
1,定义成员
2,定义抽象方法
3,为每个成员添加{},并在其中复写抽象方法
4,根据需要定义其它内容,如枚举类的成员变量,方法等
public enum WeekDay {
SUN{
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return MON;
}
},
MON{
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return TUE;
}
},
TUE{
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return WED;
}
},
WED{
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return THI;
}
},
THI{
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return FRI;
}
},
FRI{
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return SAT;
}
},
SAT{
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return SUN;
}
};
private WeekDay(){
System.out.println("first");
}
public abstract WeekDay nextDay();
}
六,枚举与单例设计模式
当枚举只有一个成员时,就可以作为一种单例的实现方式。
1,一种单例设计方式
class Single
{
private static final Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
2,枚举实现单例
public enum Single{
SINGLE;
}
---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.youkuaiyun.com" target="blank">http://edu.youkuaiyun.com</a>