原文链接 作者:Peter Lawrey 译者:陈振阳
综述
Java中的enum比其他的语言中的都强大,这产生了很多令人惊讶的用法。本文中,我将列出Java中的enum的一些特性,然后将这些特性应用到一起构成一个状态机。
Enum的单例和工具类用法
你可以非常简单地用一个enum构建一个单例或者工具类。
用enum实现一个接口
你也可以在一个enum中实现一个接口。
5 | enum Planets implements Named { |
6 | Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune; |
8 | public int order() { return ordinal()+ 1 ; } |
每一个enum实例,一个不同的子类
你可以重载一个enum实例的方法。这将高效的给一个enum的实例一个自己的实现。
02 | public enum Operation { |
03 | PLUS { double eval( double x, double y) { return x + y; } }, |
04 | MINUS { double eval( double x, double y) { return x - y; } }, |
05 | TIMES { double eval( double x, double y) { return x * y; } }, |
06 | DIVIDE { double eval( double x, double y) { return x / y; } }; |
09 | abstract double eval( double x, double y); |
使用一个enum实现一个状态机
用上边的技术,你可以做的是创建一个基于状态的enum。
在这个小例子中,解析器的状态机处理一个ByteBuffer里的原始的XML。每一个状态都有自己的处理方法,如果没有足够的可用的数据,状态机可以回来再次获取更多的数据。状态之间的每一次变换都被定义,所有状态的代码在一个enum中。
04 | void state(State state); |
08 | * @return true to keep processing, false to read more data. |
10 | boolean process(Context context); |
12 | enum States implements State { |
14 | public boolean process(Context context) { |
15 | if (context.buffer().remaining() < 16 ) return false ; |
18 | context.state(States.ROOT); |
22 | public boolean process(Context context) { |
23 | if (context.buffer().remaining() < 8 ) return false ; |
26 | context.state(States.IN_ROOT); |
32 | public void process(Context context) { |
33 | socket.read(context.buffer()); |
34 | while (context.state().process(context)); |
使用这种方式,可以创建一个XML解析器,解析器可以在10微秒内处理完数据包。大多数情况下,它跟你需要的一样高效。
Reference: Java Secret: Using an enum to build a State machine from our JCG partner Peter Lawrey at the Vanilla Java.