当我们想实现一个星期几的枚举时候我们自己编写一个类来实现!如果我们用实体类的代码如下:
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分别转化成了一个个独立的类,测试代码不变,输出的结果如下 :
-----------------------------------------------------------------------
星期二
星期三
-----------------------------------------------------------------------
我们看到的还是一样,但是实现的方式却完全不一样!所以我们可以总结用抽象方法结合匿名内部类实现比统一的更加好!