序言:java中enum中有一个有趣的特性,即可以为每一个enum实例编写方法,从而为每一个实例赋予不同的行为。
一、常量相关方法:
①:每一个enum实例都有不同的方法行为。通常我们可以为enum定义一个或多个abstact方法,然后每个实例实现该方法。
public enum ConstantSpecificMethod {
DATE_TIME{
@Override
String getInfo() {
return DateFormat.getDateInstance().format(new Date());//当前时间
}
},
CLASSPATH{
@Override
String getInfo() {
return System.getenv("CLASSPATH");//jdk文件
}
},
VERSION{
@Override
String 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{
@Override
void 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 {
@Override
boolean handle(Type type) {
switch (type) {
case ill1:
return false;
case ill2:
return true;
case ill3:
return true;
default:
return false;
}
}
},
T1 {
@Override
boolean 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中的常量相关的方法实现了一个简单的职责链。