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

来源:互联网 发布:mac安装win8双系统 编辑:程序博客网 时间:2024/04/28 18:06

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

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分别转化成了一个个独立的类,测试代码不变,输出的结果如下 :

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

星期二
星期三

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

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

原创粉丝点击