现在的位置: 首页 > 综合 > 正文

普通类实现枚举与抽象类的应用比较

2013年09月12日 ⁄ 综合 ⁄ 共 2470字 ⁄ 字号 评论关闭

当我们想实现一个星期几的枚举时候我们自己编写一个类来实现!如果我们用实体类的代码如下:

package com.jemsn.weekday;

public class WeekDay {
	//构造函数私有化 让别人不可以再创建新的对象实例
	private WeekDay () {}
   public static final WeekDay MonDay=new WeekDay();
   public static final WeekDay Tuesay=new WeekDay();
   public static final WeekDay WendsDay=new WeekDay();
   public static final WeekDay ThusDay=new WeekDay();
   public static final WeekDay FriDay=new WeekDay();
   public static final WeekDay StaDay=new WeekDay();
   public static final WeekDay SunDay=new WeekDay();
   //如果我们要一个NextDay()方法
   public WeekDay NextDay() {
	   if(this==MonDay){
		   return Tuesay;
	   }else if(this==Tuesay){
		   return WendsDay;
	   }	   
	   else if(this==WendsDay){
		   return ThusDay;
	   }
	   else if(this==ThusDay){
		   return FriDay;
	   }
	   else if(this==FriDay){
		   return StaDay;
	   }
	   else if(this==StaDay){
		   return SunDay;
	   }else {
		return MonDay;
	}
	
	 
}
 //重写ToString方法
public String toString() {
	 return this==MonDay?"星期一":this==Tuesay?"星期二":this==WendsDay?"星期三":this==ThusDay?"星期四":"星期五";
}
   
}

然后我们在测试代码里调用它:

package com.jemsn.weekday;

public class test {
  
	public static void main(String[] args) {
		WeekDay monday=WeekDay.MonDay;
		WeekDay tuesday=WeekDay.Tuesay;
		System.out.println(monday.NextDay());
		System.out.println(tuesday.NextDay());
	}

}

输出结果如下:

-----------------------------------------------------------------------

星期二
星期三

-----------------------------------------------------------------------

上面的代码我们可以看出,在我们的NextDay方法中用了一大堆的if else else if 之类的,如果我们装基改为抽象类,如下代码:

package com.jemsn.weekday;

public abstract class WeekDay {
	//构造函数私有化 让别人不可以再创建新的对象实例
	private WeekDay () {}
   public static final WeekDay MonDay=new WeekDay(){
 
	public WeekDay NextDay() {
		return WeekDay.Tuesay;
	}
	   
   };
   //采用了匿名内部类的实现方式
   public static final WeekDay Tuesay=new WeekDay(){
	   
		public WeekDay NextDay() {
			return WeekDay.WendsDay;
		}
		   
	   };
   public static final WeekDay WendsDay=new WeekDay(){
	   
		public WeekDay NextDay() {
			return WeekDay.ThusDay;
		}
		   
	   };
   public static final WeekDay ThusDay=new WeekDay(){
	   
		public WeekDay NextDay() {
			return WeekDay.FriDay;
		}
		   
	   };
   public static final WeekDay FriDay=new WeekDay(){
	   
		public WeekDay NextDay() {
			return WeekDay.StaDay;
		}
		   
	   };
   public static final WeekDay StaDay=new WeekDay(){
	   
		public WeekDay NextDay() {
			return WeekDay.SunDay;
		}
		   
	   };
   public static final WeekDay SunDay=new WeekDay(){
	   
		public WeekDay NextDay() {
			return WeekDay.MonDay;
		}
		   
	   };
   //如果我们要一个NextDay()方法
   public abstract WeekDay NextDay(); 
	
	 

 //重写ToString方法
public String toString() {
	 return this==MonDay?"星期一":this==Tuesay?"星期二":this==WendsDay?"星期三":this==ThusDay?"星期四":"星期五";
}
   
}

上面的代码中我们将if else分别转化成了一个个独立的类,测试代码不变,输出的结果如下 :

-----------------------------------------------------------------------

星期二
星期三

-----------------------------------------------------------------------

我们看到的还是一样,但是实现的方式却完全不一样!所以我们可以总结用抽象方法结合匿名内部类实现比统一的更加好!

抱歉!评论已关闭.