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_LEVELDEFAULT两种不同级别线程池,使用时可以直接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()来使用