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

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

分类: Java 560人阅读 评论(0) 收藏 举报

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

  1. package com.jemsn.weekday;
  2. public class WeekDay {
  3. //构造函数私有化 让别人不可以再创建新的对象实例
  4. private WeekDay () {}
  5. public static final WeekDay MonDay=new WeekDay();
  6. public static final WeekDay Tuesay=new WeekDay();
  7. public static final WeekDay WendsDay=new WeekDay();
  8. public static final WeekDay ThusDay=new WeekDay();
  9. public static final WeekDay FriDay=new WeekDay();
  10. public static final WeekDay StaDay=new WeekDay();
  11. public static final WeekDay SunDay=new WeekDay();
  12. //如果我们要一个NextDay()方法
  13. public WeekDay NextDay() {
  14. if(this==MonDay){
  15. return Tuesay;
  16. }else if(this==Tuesay){
  17. return WendsDay;
  18. }
  19. else if(this==WendsDay){
  20. return ThusDay;
  21. }
  22. else if(this==ThusDay){
  23. return FriDay;
  24. }
  25. else if(this==FriDay){
  26. return StaDay;
  27. }
  28. else if(this==StaDay){
  29. return SunDay;
  30. }else {
  31. return MonDay;
  32. }
  33. }
  34. //重写ToString方法
  35. public String toString() {
  36. return this==MonDay?"星期一":this==Tuesay?"星期二":this==WendsDay?"星期三":this==ThusDay?"星期四":"星期五";
  37. }
  38. }
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?"星期四":"星期五";
}
   
}

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

  1. package com.jemsn.weekday;
  2. public class test {
  3. public static void main(String[] args) {
  4. WeekDay monday=WeekDay.MonDay;
  5. WeekDay tuesday=WeekDay.Tuesay;
  6. System.out.println(monday.NextDay());
  7. System.out.println(tuesday.NextDay());
  8. }
  9. }
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 之类的,如果我们装基改为抽象类,如下代码:

  1. package com.jemsn.weekday;
  2. public abstract class WeekDay {
  3. //构造函数私有化 让别人不可以再创建新的对象实例
  4. private WeekDay () {}
  5. public static final WeekDay MonDay=new WeekDay(){
  6. public WeekDay NextDay() {
  7. return WeekDay.Tuesay;
  8. }
  9. };
  10. //采用了匿名内部类的实现方式
  11. public static final WeekDay Tuesay=new WeekDay(){
  12. public WeekDay NextDay() {
  13. return WeekDay.WendsDay;
  14. }
  15. };
  16. public static final WeekDay WendsDay=new WeekDay(){
  17. public WeekDay NextDay() {
  18. return WeekDay.ThusDay;
  19. }
  20. };
  21. public static final WeekDay ThusDay=new WeekDay(){
  22. public WeekDay NextDay() {
  23. return WeekDay.FriDay;
  24. }
  25. };
  26. public static final WeekDay FriDay=new WeekDay(){
  27. public WeekDay NextDay() {
  28. return WeekDay.StaDay;
  29. }
  30. };
  31. public static final WeekDay StaDay=new WeekDay(){
  32. public WeekDay NextDay() {
  33. return WeekDay.SunDay;
  34. }
  35. };
  36. public static final WeekDay SunDay=new WeekDay(){
  37. public WeekDay NextDay() {
  38. return WeekDay.MonDay;
  39. }
  40. };
  41. //如果我们要一个NextDay()方法
  42. public abstract WeekDay NextDay();
  43. //重写ToString方法
  44. public String toString() {
  45. return this==MonDay?"星期一":this==Tuesay?"星期二":this==WendsDay?"星期三":this==ThusDay?"星期四":"星期五";
  46. }
  47. }
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分别转化成了一个个独立的类,测试代码不变,输出的结果如下 :

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

星期二
星期三

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值