當我們想實現一個星期幾的枚舉時候我們自己編寫一個類來實現!如果我們用實體類的代碼如下:
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分別轉化成了一個個獨立的類,測試代碼不變,輸出的結果如下 :
-----------------------------------------------------------------------
星期二
星期三
-----------------------------------------------------------------------
我們看到的還是一樣,但是實現的方式卻完全不一樣!所以我們可以總結用抽象方法結合匿名內部類實現比統一的更加好!