Java Secret: Using an enum to build a State machine(Java秘术:用枚举构建一个状态机)
来源:互联网 发布:开源网络管理软件 编辑:程序博客网 时间:2024/05/22 04:26
最近在读Hadoop#Yarn部分的源码,读到状态机那一部分的时候,感到enmu的用法实在是太灵活了,在给并发编程网翻译一篇文章的时候,正好碰到一篇这样的文章,就赶紧翻译下来,涨涨姿势。
原文链接:http://www.javacodegeeks.com/2011/07/java-secret-using-enum-to-build-state.html
作者:
综述
Java中的enum比其他的语言中的都强大,这产生了很多令人惊讶的用法。
本文中,我将列出Java中的enum的一些特性,然后将这些特性应用到一起构成一个状态机。
Enum的单例和工具类用法
你可以非常简单地用一个enmu构建一个单例或者工具类。
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.htmlpublic 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.
Related Articles:
- Low GC in Java: Use primitives instead of wrappers
- Java Lambda Syntax Alternatives
- How does JVM handle locks
- Erlang vs Java memory architecture
- Java Fork/Join for Parallel Programming
0 0
- Java Secret: Using an enum to build a State machine(Java秘术:用枚举构建一个状态机)
- Java秘术:用枚举构建一个状态机
- java enum 一个枚举类型
- Java枚举(Enum)
- java基础---枚举(enum)
- Java enum(枚举)小结
- java enum(枚举)理解
- java enum(枚举)理解
- Java enum(枚举) 详解
- Java中的enum(枚举)
- [Java 14 枚举] Enum, enum
- Java 枚举类型(java.lang.Enum)
- Java enum 枚举类型
- JAVA枚举类型Enum
- Java Enum 枚举
- Java Enum 枚举
- java 枚举 Enum
- [Java] enum 枚举类型
- iOS7——UIControlEventTouchDown延迟响应问题
- Thetest
- 安装svn客户端和vs2012的svn插件之后,在项目右键菜单里没有“更新项目至最新版本”和“提交项目变更”选项
- POJ - 2886 Who Gets the Most Candies?(线段树)
- SVN安装配置使用
- Java Secret: Using an enum to build a State machine(Java秘术:用枚举构建一个状态机)
- 练手小项目(2)-生活小助手--星座运势查询
- AmqpTemplate-发送-接收-消息
- mac升级系统之后,eclipse找不到JDK,java工程报错
- 第十二周项目二(1)求N组数的最大公约数
- ScrollView分析
- 《Java并发编程实战》---线程安全性---对象的共享
- 推荐系统挖掘长尾了吗?
- asp.net中FTP读取文件列表时中文乱码