总览
Java中的枚举比许多其他语言更强大,这可能导致令人惊讶的用途。

在本文中,我概述了Java 枚举的一些单独功能,并将它们组合在一起形成一个状态机。

单例和实用程序类的枚举
您可以非常简单地将枚举用作Singleton或Utility。

enum Singleton {INSTANCE;
}
enum Utility {; // no instances
}

枚举实现一个接口
您还可以在枚举中实现接口。

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; }
}

每个枚举实例都有一个不同的子类
您可以覆盖实例的行为。 这有效地为实例提供了具有自己实现的枚举的另一个子类。

// 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 constantabstract double eval(double x, double y);
}

使用枚举作为状态机
您可以使用所有这些技术来创建基于枚举的语句。

在这个简短的示例中,解析器状态机处理ByteBuffer中的原始XML。 每个状态都有其自己的处理方法,如果没有足够的可用数据,则状态机可以返回以检索更多数据。 状态之间的每个过渡都定义明确,所有状态的代码都放在一个枚举中

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 headerif(headerComplete)context.state(States.ROOT);return true;}}, ROOT {public boolean process(Context context) {if (context.buffer().remaining() < 8) return false;// read root tagif(rootComplete)context.state(States.IN_ROOT);return true;}}
}public void process(Context context) {socket.read(context.buffer());while(context.state().process(context));
}

使用这种方法,可以编写一个XML解析器,该解析器可以在不到10微秒的时间内处理数据包。 它是大多数情况下所需的效率。

参考: Java秘密:使用我们的JCG合作伙伴 Peter Lawrey在Vanilla Java上 使用枚举来构建状态机 。

相关文章:
  • Java中的低GC:使用原语而不是包装器
  • Java Lambda语法替代
  • JVM如何处理锁
  • Erlang与Java内存架构
  • Java Fork / Join进行并行编程

翻译自: https://www.javacodegeeks.com/2011/07/java-secret-using-enum-to-build-state.html

Java Secret:使用枚举构建状态机相关推荐

  1. k8s secret使用_Java Secret:使用枚举构建状态机

    k8s secret使用 总览 Java中的枚举比许多其他语言更强大,可以导致令人惊讶的用途. 在本文中,我概述了Java 枚举的一些单独功能,并将它们放在一起形成一个状态机. 单例和实用程序类的枚举 ...

  2. 用好 Java 中的枚举,让你的工作效率飞起来!

    1.概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承j ...

  3. c枚举类型enum例题_一篇文章让你详细了解Java中Enum枚举类的使用

    文章前记 程序员工作久了便可能整日忙碌于"增删改查"中,迷失方向,毫无进步. 该公众号致力于分享软件开发相关的原创干货,助你完成从程序员到架构师的进阶之路! 努力!做一个NB的Co ...

  4. 用好 Java 中的枚举,真的没有那么简单!

    1.概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用  Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承 ...

  5. java.lang包—枚举类Enum

    原文作者:山高我为 原文地址:java enum的用法详解 目录 一.enum关键字 二.Enum类源码 三.疑问 四.Enum常见用法 一.enum关键字 enum关键字是在Java1.5也就是Ja ...

  6. Java编译环境的构建

    Java编译环境的构建 一.在环境变量中: classpath C:/Sun/AppServer/jdk/lib/tools.jar;C:/Sun/AppServer/jdk/lib/dt.jar; ...

  7. java中使用Semaphore构建阻塞对象池

    java中使用Semaphore构建阻塞对象池 Semaphore是java 5中引入的概念,叫做计数信号量.主要用来控制同时访问某个特定资源的访问数量或者执行某个操作的数量. Semaphore中定 ...

  8. oidc_使用Java EE和OIDC构建Java REST API

    oidc "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. ...

  9. java单例枚举_Java增强枚举的用例

    java单例枚举 Brian Goetz在消息" 增强枚举-用例 "中写道:"我们希望就现在实现的功能[ 增强枚举 ]获得用户反馈." 他陈述了他的消息的第一个 ...

最新文章

  1. java环境变量_java环境变量
  2. windoes server 关闭服务端口方法、漏洞补丁解决
  3. 进程用户态 上下文切换需要保存哪些_漫话性能:CPU上下文切换
  4. JAVA SE、EE、ME,JRE、JDK,基本数据类型,访问修饰符、函数、封装的概念、UML类图、构造方法、this关键字、static关键字、方法重载、方法重写、包(packahe)
  5. OOD之问题空间到解空间—附FP的建模
  6. Matlab线性/非线性规划优化算法(1)
  7. mysql子查询总分最高的学生_mysql高级内容
  8. 像excel一样规律填充(三)
  9. Hibernate注释总结
  10. 锐捷长ping_锐捷 ping 网关通 ping 机器不通
  11. python 主函数传参_Python函数传参方法超级大汇总
  12. 4G的小程序与5G的Chromium OS?
  13. 手把手教你电脑下载b站视频
  14. mysql in数量限制_SQL语句中in的个数限制为1000
  15. dismiss和remove_你真的了解iOS中控制器的present和dismiss吗?
  16. HTML5 案例学习笔记
  17. Gmail账号申诉成功
  18. 改纸盒大小_关于纸箱尺寸的一些知识
  19. 黑马程序员C++ 第二阶段 核心程序
  20. 视频通话和聊天工具Jitsi

热门文章

  1. cassandra_Apache Cassandra和低延迟应用程序
  2. 通过TLS发送的Java邮件
  3. jdk8 接口默认方法_JDK 8中方便的新地图默认方法
  4. react 消息队列_具有AkkaReact流的React队列
  5. Hibernate事实:有利于双向集vs列表
  6. 为什么SpringBoot如此受欢迎,以及如何有效地学习SpringBoot?
  7. 选择Java密码算法第1部分-散列
  8. 使用Java第2部分查询DynamoDB项
  9. Spring和Hibernate的自定义审核日志
  10. jsf集成spring_JSF – PrimeFaces和Hibernate集成项目