您的位置:首页 > 职场人生

黑马程序员_枚举总结

2014-01-02 15:39 253 查看
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"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
4000
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.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息