近期在讀Hadoop#Yarn部分的源代碼。讀到狀態機那一部分的時候,感到enmu的使用方法實在是太靈活了,在給併發編程網翻譯一篇文章的時候,正好碰到一篇這種文章。就趕忙翻譯下來,漲漲姿式。html
原文連接:http://www.javacodegeeks.com/2011/07/java-secret-using-enum-to-build-state.html
做者:java
Java中的enum比其它的語言中的都強大,這產生了很是多使人吃驚的使用方法。編程
本文中,我將列出Java中的enum的一些特性,而後將這些特性應用到一塊兒構成一個狀態機。併發
你可以很easy地用一個enmu構建一個單例或者工具類。oracle
enum Singleton { INSTANCE; } enum Utility { ; // no instances }
你也可以在一個enum中實現一個接口。app
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的實例一個本身的實現。jvm
// 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。socket
在這個小樣例中,一個解析器的狀態機處理一個來自一個ByteBuffer的原始的XML。每一個狀態都有本身的處理方法,假設沒有足夠的可用的數據,狀態機可以返回來再次獲取不少其它的數據。ide
狀態之間的每一次變換都被定義,所有狀態的代碼在一個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: