怎么做能更好一点?我们前面已经认识到枚举就是一个特殊的类,它可以有方法和属性,同时每个声明的枚举项都是这个枚举类型的一个实例。那么我们能不能使用“模板方法模式”来改造一下这个枚举类呢?当然可以!我们把那个例子重构一下,变成下面这个样子:
Java代码 |
public enum WeekDay { MONDAY{ @Override public void printWeekDay() { System.out.println(“Today is Monday!”); } }, TUESDAY{ @Override public void printWeekDay() { System.out.println(“Today is Tuesday!”); } }, WENSDAY{ @Override public void printWeekDay() { System.out.println(“Today is Wensday!”); } }, THURSDAY{ @Override public void printWeekDay() { System.out.println(“Today is Thursday!”); } }, FRIDAY{ @Override public void printWeekDay() { System.out.println(“Today is Friday!”); } };
/** * 根据工作日的不同打印不同的信息 */ public abstract void printWeekDay(); } |
首先,我们把方法printWeekDay改为抽象方法,然后我们在每一个枚举常量中实现了在枚举类型里定义的这个抽象方法。这样,每为枚举类型添加一个新的枚举常量,都必须实现枚举类型中定义的抽象方法,不然编译器提示出错。之所以可以这么做的原因是,虚拟机将枚举类型中声明的每一个枚举常量,创建成为一个单独的枚举类型的子类。
这样,再配合使用Tiger里的静态导入,调用者的代码就可以这样写了:
Java代码 |
MONDAY.printWeekDay(); TUESDAY.printWeekDay(); //or better... getWeekDay().printWeekDay(); |
这些代码显然要比常见的if(weekDay == WeekDay.MONDAY){...} else if(weekDay == WeekDay.TUESDAY) else {...}形式强多了,它们易读、容易扩展和维护。
---------------------------------------------------------------------------------------------------
系列文章:
说说Java中的枚举——JDK1.4之前
说说Java中的枚举——定义枚举
说说Java中的枚举——简单使用
说说Java中的枚举——EnumMap与EnumSet
说说Java中的枚举——就是一个类
说说Java中的枚举——模板方法
说说Java中的枚举——反向查找、总结