说说Java中的枚举——模板方法

本文探讨了如何利用模板方法模式改进Java枚举,将printWeekDay方法变为抽象方法,确保每个枚举常量都必须实现该方法。这种做法增强了代码的可读性和可扩展性,减少了if-else语句的使用,提高了维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 谈这个话题前我们要看一下在 就是一个类一文中改写的printWeekDay方法,在那个例子里WeekDay是丰富一些了,不过使用switch对枚举常量逐个判断以便定制不同的行为,扩展起来要麻烦了一些。假如为WeekDay添加了一个新的枚举常量,如果你忘了同时为它在switch中添加相应的case标示,那么即使有default标示来提示错误,也只能在运行后才能发现。

    怎么做能更好一点?我们前面已经认识到枚举就是一个特殊的类,它可以有方法和属性,同时每个声明的枚举项都是这个枚举类型的一个实例。那么我们能不能使用“模板方法模式”来改造一下这个枚举类呢?当然可以!我们把那个例子重构一下,变成下面这个样子:

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中的枚举——反向查找、总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值