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