zoukankan      html  css  js  c++  java
  • Java Secret: Using an enum to build a State machine(Java秘术:用枚举构建一个状态机)

    近期在读Hadoop#Yarn部分的源代码。读到状态机那一部分的时候,感到enmu的使用方法实在是太灵活了,在给并发编程网翻译一篇文章的时候,正好碰到一篇这种文章。就赶紧翻译下来,涨涨姿势。

    原文链接:http://www.javacodegeeks.com/2011/07/java-secret-using-enum-to-build-state.html
    作者:Peter Lawrey    译者:陈振阳

    综述

    Java中的enum比其它的语言中的都强大,这产生了非常多令人吃惊的使用方法。

    本文中,我将列出Java中的enum的一些特性,然后将这些特性应用到一起构成一个状态机。

    Enum的单例和工具类使用方法

    你能够很easy地用一个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.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.

    Related Articles:

     


  • 相关阅读:
    网络
    oracle 操作
    oracle可重复执行脚本(添加字段)
    c#命名规范(转载)
    Oracle修改表结构字段名和字段长度
    C#Winform的DEV下拉下拉控件介绍
    TPL DataFlow初探(二)
    TPL DataFlow初探(一)
    C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)
    C# 关于委托
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5202978.html
Copyright © 2011-2022 走看看