序言:java中enum中有一个有趣的特性,即可以为每一个enum实例编写方法,从而为每一个实例赋予不同的行为。
一、常量相关方法:
①:每一个enum实例都有不同的方法行为。通常我们可以为enum定义一个或多个abstact方法,然后每个实例实现该方法。
public enum ConstantSpecificMethod {DATE_TIME{@OverrideString getInfo() {return DateFormat.getDateInstance().format(new Date());//当前时间}},CLASSPATH{@OverrideString getInfo() {return System.getenv("CLASSPATH");//jdk文件}},VERSION{@OverrideString getInfo() {return System.getProperty("java.version");//java版本}};abstract String getInfo();public static void main(String[] args) {for (ConstantSpecificMethod value : ConstantSpecificMethod.values()) {System.out.println(value.getInfo());}}}//OutPut:2021-5-10.;C:\Program Files\Java\jdk1.8.0_231\lib\;1.8.0_231
注意:enum实例不能当做一个真的类型来使用
②:普通的常量相关方法,eunm实例也可以覆盖
public enum OverrideConstantSpecific {NUT,BOLT,WASHER{@Overridevoid f() {System.out.println("override f()");}};void f(){System.out.println("f()");}public static void main(String[] args) {for (OverrideConstantSpecific value : OverrideConstantSpecific.values()) {value.f();}}}
通过上面程序,我们可以看到,普通的方法enum实例也可以覆盖,如果没覆盖的实例,将会调用enum中的方法。
二、enum职责链
在职责链设计模式中,以多做方法来处理同一个问题,然后将他们连接到一起,当请求到达时候,他遍历整个链,找到对应的处理。
通过常量相关的方法,可以很容易的实现一个职责链
package com.package19;public class AskForLeave {enum Type {ill1, ill2, ill3;}enum Allow {S1 {@Overrideboolean handle(Type type) {switch (type) {case ill1:return false;case ill2:return true;case ill3:return true;default:return false;}}},T1 {@Overrideboolean handle(Type type) {switch (type) {case ill3:return true;default:return false;}}};abstract boolean handle(Type type);}void AskForLevae(Type type) {for (Allow value : Allow.values()) {boolean b = value.handle(type);System.out.println(value + "的处理结果为:" + b);if (!b) {System.out.println("该病假: " + type + " 不允许");return;}}System.out.println("愉快的请到假期");}public static void main(String[] args) {AskForLeave askForLeave = new AskForLeave();askForLeave.AskForLevae(Type.ill1);}}
上述请假的列子,就是使用了enum中的常量相关的方法实现了一个简单的职责链。
