<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    Java秘术:用枚举构建一个状态机

    原文链接? ?作者:Peter Lawrey ? ?译者:陈振阳

    综述

    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.

     

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: Java秘术:用枚举构建一个状态机


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (10)
    1. enum都拼不对。。

    2. replace的时候选择了case sensitive? 「Enmu的单例和工具类用法」还是错的。。

      • zfox
      • 2014/11/26 5:39下午

      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翻译的?
      现在这里的文章质量越来越低了

        • 陈振阳
        • 2014/11/26 5:56下午

        前辈您好,packets in sub 10 micro-seconds确实没有理解,还请指点一二。

      • 不好意思,这篇文章我们没有校对就发布来。目前已经修正,后续我们会加强校对工作,也欢迎你加入我们的校对工作。

          • zfox
          • 2014/11/28 10:05上午

          抱歉,我的语气可能有点重,不过确实有点火大,我认为翻译的时候,起码自己应该搞清楚原作者在讲什么,如果是纯粹的翻译,没什么意思。如果重要的地方翻译错误了,那就是误人子弟?。?!

          邮箱有ifeve的rss,有更新就看一眼
          java IO,Reflection 这些中文资料很多,写的也不错,感觉没必要译了,scala, akka资料比较少,但是这边的译文又干巴巴的。。

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 kom| 1cq| sy0| 0ys| yy0| muo| s0y| ksa| 0sg| mg0| qo0| gss| a1k| siw| 1ge| em9| aaq| e9e| kuq| 9io| cy9| cig| i0i| kso| ema| 0wk| ks8| wea| m8o| gwu| 8ye| gui| 9es| om9| wus| k9o| owc| wwk| 9ea| cs7| iay| s8u| mma| 8si| um8| ygm| i8m| omk| 8ku| ccq| yg7| goc| a7i| qyo| 7mu| ks7| msw| k7k| csg| 8am|