Java中enum一般用来表示一组常量。除此外还可以用来实现单列模式,结合这些特性我们可以用来干一些骚操作
利用枚举构建不同优先级线程池
public enum ThreadPoolInstances implements Consumer {
HIGH_LEVEL(10, new ThreadPoolExecutor.CallerRunsPolicy()),
DEFAULT(5, new ThreadPoolExecutor.AbortPolicy());
private final ThreadPoolExecutor executor;
ThreadPoolInstances(int coreSize, RejectedExecutionHandler handler) {
this.executor = new ThreadPoolExecutor(Math.max(coreSize, 1), 50, 300L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(300), handler);
}
@Override
public void consumer(Runnable runnable) {
this.executor.submit(runnable);
}
}
上面的代码就构建了一个ThreadPoolInstances
枚举,里面有HIGH_LEVEL
、DEFAULT
两种不同级别线程池,使用时可以直接ThreadPoolInstances.HIGH_LEVEL.consumer(doSomething)
。
大家可以按照自己的实际需要构建不同类型的线程池,也可以在此基础上继续做到优雅的停止线程池
利用枚举构建一个状态机
public enum Express {
IS_NULL("is null") {
@Override
public boolean eval(String expressValue, String value) {
todo
}
},
EQ("==") {
@Override
public boolean eval(String expressValue, String value) {
todo
}
},
NE("!=") {
@Override
public boolean eval(String expressValue, String value) {
todo
}
},
GT(">") {
@Override
public boolean eval(String expressValue, String value) {
todo
}
},
LT("<") {
@Override
public boolean eval(String expressValue, String value) {
todo
}
};
private final String symbol;
Express(String symbol) {
this.symbol = symbol;
}
public abstract boolean eval(String expressValue, String value);
public static Express valueOfSymbol(String symbol) {
for (Express value : values()) {
if (value.symbol.equals(symbol)) {
return value;
}
}
throw new IllegalArgumentException("未支持表达式[" + symbol + "]");
}
}
Express
枚举定义了一些常见的表达式用来计算boolean
类型的结果,不同表达式有不同的运算逻辑,在枚举内部定义一个抽象方法eval
,在枚举值内部进行实现
可以通过Express.valueOfSymbol(表达式).eval()
来使用