Java秘术:用枚举构建一个状态机
原文链接 作者:
综述
Java中的enum比其他的语言中的都强大,这产生了很多令人惊讶的用法。本文中,我将列出Java中的enum的一些特性,然后将这些特性应用到一起构成一个状态机。
Enum的单例和工具类用法
你可以非常简单地用一个enum构建一个单例或者工具类。
</pre> enum Singleton { INSTANCE; } enum Utility { ; // no instances }
用enum实现一个接口
你也可以在一个enum中实现一个接口。
interface Named { public String name(); public int order(); } enum Planets implements Named { Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune; // name() is implemented automagically. public int order() { return ordinal()+1; } }
每一个enum实例,一个不同的子类
你可以重载一个enum实例的方法。这将高效的给一个enum的实例一个自己的实现。
// from http://download.oracle.com/javase/1,5.0/docs/guide/language/enums.html public enum Operation { PLUS { double eval(double x, double y) { return x + y; } }, MINUS { double eval(double x, double y) { return x - y; } }, TIMES { double eval(double x, double y) { return x * y; } }, DIVIDE { double eval(double x, double y) { return x / y; } }; // Do arithmetic op represented by this constant abstract double eval(double x, double y); }
使用一个enum实现一个状态机
用上边的技术,你可以做的是创建一个基于状态的enum。
在这个小例子中,解析器的状态机处理一个ByteBuffer里的原始的XML。每一个状态都有自己的处理方法,如果没有足够的可用的数据,状态机可以回来再次获取更多的数据。状态之间的每一次变换都被定义,所有状态的代码在一个enum中。
interface Context { ByteBuffer buffer(); State state(); void state(State state); } interface State { /** * @return true to keep processing, false to read more data. */ boolean process(Context context); } enum States implements State { XML { public boolean process(Context context) { if (context.buffer().remaining() < 16) return false; // read header if(headerComplete) context.state(States.ROOT); return true; } }, ROOT { public boolean process(Context context) { if (context.buffer().remaining() < 8) return false; // read root tag if(rootComplete) context.state(States.IN_ROOT); return true; } } } public void process(Context context) { socket.read(context.buffer()); 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.
原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java秘术:用枚举构建一个状态机


enum都拼不对。。
thanks
感谢校对,已修正
replace的时候选择了case sensitive? 「Enmu的单例和工具类用法」还是错的。。
Using this approach it is possible to write an XML parser which can process packets in sub 10 micro-seconds. It is as efficient as you would need for most cases.
“解析器可以处理10毫秒内的数据包”。。。
确定不是用google翻译的?
现在这里的文章质量越来越低了
前辈您好,packets in sub 10 micro-seconds确实没有理解,还请指点一二。
是不是应该翻译成微秒?
thanks
不好意思,这篇文章我们没有校对就发布来。目前已经修正,后续我们会加强校对工作,也欢迎你加入我们的校对工作。
抱歉,我的语气可能有点重,不过确实有点火大,我认为翻译的时候,起码自己应该搞清楚原作者在讲什么,如果是纯粹的翻译,没什么意思。如果重要的地方翻译错误了,那就是误人子弟啊!!
邮箱有ifeve的rss,有更新就看一眼
java IO,Reflection 这些中文资料很多,写的也不错,感觉没必要译了,scala, akka资料比较少,但是这边的译文又干巴巴的。。