一般クラス実装列挙と抽象クラスの応用比較
私たちが1週間の列挙を実現したいとき、私たちは自分でクラスを作って実現します.エンティティ・クラスのコードを使用すると、次のようになります.
テストコードで呼び出します.
出力結果は次のとおりです.
-----------------------------------------------------------------------
火曜日水曜日
-----------------------------------------------------------------------
上のコードは、私たちのNextDayメソッドでif else else ifなどがたくさん使われていることを示しています.もし私たちが抽象クラスに変更したら、次のコードがあります.
上のコードではif elseをそれぞれ独立したクラスに変換し、テストコードは変わらず、出力された結果は以下の通りです.
-----------------------------------------------------------------------
火曜日水曜日
-----------------------------------------------------------------------
私たちが見ているのは同じですが、実現方法は全然違います.だから抽象的な方法で匿名の内部クラスを結合して統一するよりも良いことをまとめることができます!
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をそれぞれ独立したクラスに変換し、テストコードは変わらず、出力された結果は以下の通りです.
-----------------------------------------------------------------------
火曜日水曜日
-----------------------------------------------------------------------
私たちが見ているのは同じですが、実現方法は全然違います.だから抽象的な方法で匿名の内部クラスを結合して統一するよりも良いことをまとめることができます!