- 浏览: 170227 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
Mr.San:
<div class="quote_title ...
java 枚举高级应用之状态机 -
Mr.San:
<pre name="code" c ...
java 枚举高级应用之状态机 -
nocb:
对,Enums 没有
java 枚举高级应用之状态机 -
binbinyouli:
run(Enums.random(MONEY.getValue ...
java 枚举高级应用之状态机
枚举类型非常适合用来创建状态机,一个状态机通常可以拥有有限的几个状态,他通常根据输入,从一个状态进入到下一个状态。
下面是一个用枚举实现的自动售货机的例子,很简陋,但是表达清楚了意思就差不多了,也希望各位看官能指出不足之处。
package enums; import java.util.Random; /** * @描述 售货机可以接收的钞票金额和所有商品的价格 * @创建时间 2012-5-27 * @另请参照 */ public enum Input { /**五分硬币**/ NICKEL(5), /**一角硬币**/ DIME(10), /**两角五分**/ QUARTER(25), /**一块美金**/ DOLLAR(100), /**药膏2元**/ TOOTHPASTE(200), /**炸薯条75美分**/ CHIPS(75), /**苏打水1元**/ SODA(100),// /**肥皂5毛**/ SOAP(50), ABORT_TRANSACTION{ public int amount(){ throw new RuntimeException("退出时不能获取余额!"); } }, STOP{ public int amount(){ throw new RuntimeException("关机时不能获取余额!"); } }; //金额 int value; Input(int value){this.value = value;} Input(){} //返回该操作项的金额 int amount(){return value;} /** * @return 随机获取的操作 */ public static Input randomSelection(){ return values()[new Random(System.nanoTime()).nextInt(values().length)]; } }
package enums; import static enums.Input.*; import java.util.EnumMap; /** * 对自动售货机的状态分类 */ public enum Category { /**放入钞票**/ MONEY(NICKEL,DIME,QUARTER,DOLLAR), /**选择商品**/ ITEM_SELECTION(TOOTHPASTE,CHIPS,SODA,SOAP), /**退出**/ QUIT_TRANSACTION(ABORT_TRANSACTION), /**关机**/ SHUT_DOWN(STOP); private Input[] values; Category(Input... types){values = types;} public static EnumMap<Input, Category> categories = new EnumMap<Input, Category>(Input.class); public Input[] getValues(){ return values; } //初始化自动售货机状态集合 static { for (Category c : Category.class.getEnumConstants()) { for(Input input : c.values){ categories.put(input, c); } } } /**返回该操作项所属状态**/ public static Category categorize(Input input){ return categories.get(input); } }
package enums; import static enums.Category.*; /** * 自动售货机 */ public class VendingMachine { //当前运行状态 private static State state = State.RESTING; //当前余额 private static int amount = 0; //当前选择商品 private static Input selection = null; /**持续状态,不能做其他操作**/ enum StateDuration{TRANSIENT} /** * 运行状态 */ enum State{ /**初始界面**/ RESTING{ void next(Input input){ switch (Category.categorize(input)) { case MONEY: amount += input.amount(); System.out.println("放入金额:"+input.amount()+"美分"); state = ADDING_MONEY; break; case SHUT_DOWN: state = TERMINAL; break; default: state = RESTING; break; } } }, /**选择商品**/ ADDING_MONEY{ void next(Input input){ switch (Category.categorize(input)) { case MONEY: amount += input.amount(); System.out.println("再次放入金额:"+input.amount()+"美分,您的余额是:"+amount+"美分"); break; case ITEM_SELECTION: selection = input; System.out.println("选择商品:"+input); if(amount < input.amount()){ System.out.println("你的余额不够购买商品:"+input); state = ADDING_MONEY; }else state = DISPENSING; break; case QUIT_TRANSACTION: state = GIVING_CHANGE; break; case SHUT_DOWN: state = TERMINAL; break; default: state = ADDING_MONEY; break; } } }, /**发出商品,交易成功**/ DISPENSING(StateDuration.TRANSIENT){ void next(){ System.out.println("交易成功!请拿好您的商品:"+selection); //扣除购买商品的金额 amount -= selection.amount(); state = GIVING_CHANGE; } }, /**找零**/ GIVING_CHANGE(StateDuration.TRANSIENT){ void next(){ if(amount > 0){ System.out.println("请拿好您的找零:"+amount+"美分"); amount = 0; } state = TERMINAL; } }, /**交易终止**/ TERMINAL{ void output(){ System.out.println("交易结束"); } }; private boolean isTransient = false; /**当前是否是瞬时状态(即不可以做其他操作)**/ public boolean isTransient(){return this.isTransient;} State(){} State(StateDuration stateDuration){this.isTransient = true;} //默认方法(在瞬时状态时做其他操作时被调用) void next(Input input){ System.out.println("该状态不能做其他操作!");} //默认方法(在非瞬时状态时不做操作时被调用) void next(){ System.out.println("请选择一个操作!");} //默认方法(查看余额) void output(){System.out.println("您的余额还剩:"+amount+"美分");} } //执行一个操作 public static void run(Input gen){ if(state!=State.TERMINAL){ if(state.isTransient()){ state.next(); }else{ state.next(gen); } }else{ state.output(); } } //测试 public static void main(String[] args) { // TODO Auto-generated method stub int i = 0; while(true){ switch (state) { case RESTING: run(Enums.random(MONEY.getValues())); break; case ADDING_MONEY: //如果金额不足 if(i > 0){ run(Enums.random(MONEY.getValues())); i = 0; }else{ run(Enums.random(ITEM_SELECTION.getValues())); i++; } break; case TERMINAL: run(Input.STOP); return; default: run(null); break; } } } }
测试写的不怎么好。没那么多时间。
评论
4 楼
Mr.San
2016-07-27
binbinyouli 写道
run(Enums.random(MONEY.getValues()));
Enums从哪里来?
Enums从哪里来?
class Enums { private static java.util.Random rand = new java.util.Random(); public static <T extends Enum<T>> T random(Class<T> ec) { System.out.print("随机抽取" + ec + "中的一个元素:"); return random(ec.getEnumConstants()); } public static <T> T random(T[] values){ int index = rand.nextInt(values.length); System.out.println(".index: " + index); return values[index]; } }
3 楼
Mr.San
2016-07-27
class Enums { private static java.util.Random rand = new java.util.Random(); public static <T extends Enum<T>> T random(Class<T> ec) { System.out.print("随机抽取" + ec + "中的一个元素:"); return random(ec.getEnumConstants()); } public static <T> T random(T[] values){ int index = rand.nextInt(values.length); System.out.println(".index: " + index); return values[index]; } }
2 楼
nocb
2013-05-12
对,Enums 没有
1 楼
binbinyouli
2013-03-25
run(Enums.random(MONEY.getValues()));
Enums从哪里来?
Enums从哪里来?
发表评论
-
System.getProperty("file.encoding") 究竟获取的是什么编码
2018-07-04 16:18 1347一般是获取编译main class的文件编码,但是这个编码是由 ... -
分享一个自己 写的httpclient工具类
2018-01-26 13:13 822package com.fastwork.bm.util; ... -
二进制运算
2016-06-05 21:27 576一、有关位运算的基础知识总结 位运算包括:& ... -
java 插入排序
2015-08-12 11:41 560public static int[] insertSor ... -
tomcat gzip 压缩配置,实现文件自动压缩的功能
2015-04-13 14:56 3181项目使用的是extjs作为前端框架,这样就需要加载大 ... -
java 根据IP地址获取对应的地域信息
2015-03-24 12:01 1560/**根据IP地址获取地域信息 * @param ip ... -
正则表达式小结
2014-08-22 20:53 6321.Matcher 中的带参数的reset方法可以重复使用 ... -
javax.servlet.ServletException: PermGen space
2014-04-20 22:11 679将eclipse 里面的 vm arguments 加入以下 ... -
java 枚举中的枚举
2012-05-27 14:34 1639package enums; import java.u ... -
Java 枚举高级应用之责任链模式
2012-05-27 14:31 2129看 thinking in java 枚举那 ... -
java 位运算小计
2012-04-20 19:32 936二进制数据 分为原码,反码 和补码 。 做位运算的时候都是用 ...
相关推荐
在Java编程语言中,枚举(enum)是一种特殊的类,用于定义一组固定的常量。...枚举的这些特性使其在设计模式、数据模型、状态机等多种场景中都有广泛应用。理解并熟练运用Java枚举,能显著提高代码质量和可维护性。
枚举类型还可以用于实现策略模式、状态机等设计模式,提供了比常量类更安全、更灵活的解决方案。 总之,Java的枚举类型`Enum`不仅提供了对常量集的封装,还具备了类的所有功能,包括方法、构造函数和继承。它极大地...
枚举在设计模式、状态机等场景中非常有用。 注解(Annotation)是元数据的一种形式,它提供了向编译器或JVM传递信息的方式。Java提供了标准注解如`@Override`, `@Deprecated`, `@ SuppressWarnings`,同时允许...
### 高级Java工程师面试考纲详解 #### Java基础 1. **Collection和Map** - **继承体系**:理解`Collection`接口与其子接口如`List`、`Set`的关系,以及`Map`接口的不同实现类之间的联系。 - **具体实现**:深入...
3. 状态机:枚举在状态机的设计中非常有用,每个枚举值代表一种状态。 4. 网络协议:在网络编程中,枚举常用于定义协议中的各种标志和状态。 通过学习枚举这一概念,开发者可以更好地组织代码,提高代码的可读性和...
开发者可以使用枚举类型(enum)来表示不同的游戏状态,并通过状态机模式来管理这些状态。 8. **资源管理**:游戏中的图片、音频等资源需要被正确加载和释放,避免内存泄漏。Java提供了多种I/O流类来读取文件,同时...
开发者需要设计一种机制来跟踪和管理这些状态,可能使用枚举类型或布尔变量来表示。 6. **编译与构建过程**:`.classpath`和`.project`文件是Eclipse IDE的项目配置文件,它们定义了项目的依赖和构建路径。`....
这些状态可以通过枚举类型或状态机模式来管理。 9. **对象池设计**:为了提高性能,开发者可能采用了对象池设计模式,预先创建一部分对象并复用,而不是频繁地创建和销毁,如子弹和敌机的实例。 10. **游戏保存和...
6. **状态机**:游戏的状态管理通常用到状态机的概念,蛇的不同状态(如移动、吃食物、死亡)可以通过状态机进行逻辑切换。 7. **集合与数据结构**:蛇的身体可能用链表或数组列表来存储,每次移动时更新这些数据...
开发者可能使用条件语句(if-else)、switch语句或枚举类型来实现状态机,确保游戏流程的正确执行。 **5. 存储与持久化** 为了保存玩家的成绩,游戏可能采用了文件存储或数据库技术。Java提供了多种文件I/O流API,...
6. **游戏状态管理**:游戏可能包含多个状态(如开始、游戏进行、暂停、结束),开发者可能使用枚举或状态机来管理这些状态的切换。 7. **对象结构**:游戏中的各种元素(如角色、敌人、道具)可能被设计为面向对象...
总之,这个基于Java的电梯模拟程序v2.0不仅能够帮助我们掌握Java编程基础,还能深入理解多线程、并发控制、状态机设计等高级概念,对于提升编程技能和解决问题的能力具有极大的实践价值。通过分析和学习这个项目的...
- **枚举类型的高级应用**:介绍枚举类型在实际编程中的灵活运用,比如利用枚举类型简化状态机的设计。 #### 高级类设计技术要点 - **泛型的高级话题**:深入探讨泛型通配符、类型边界等高级特性,以及它们在实际...
这些状态可以通过使用枚举类型或者状态机来管理,确保游戏逻辑的正确执行。 7. **数据结构与算法**: 蛇的身体由一系列坐标点组成,可以使用数组、链表或其他数据结构来表示。移动和碰撞检测涉及到对这些数据结构的...
- 用于定义状态机的状态。 - 作为配置项的枚举列表。 #### 8. 常用前端框架简介 - **框架概览**: 包括React、Vue、Angular等主流前端框架的介绍及其核心特点。 - **适用场景**: - 快速搭建Web应用程序界面。 - ...
Swing是建立在AWT之上的更高级的库,提供了更多的组件和功能。在这个项目中,你会看到如何使用JFrame、JPanel、JButton等Swing组件来构建游戏界面。 3. **事件处理**:游戏的交互性主要通过事件监听器实现,例如...
开发者通常会使用枚举类型(enum)来定义游戏状态,并用状态机模型来管理这些状态之间的切换。 综上所述,这个基于Java的飞机大战小游戏不仅展示了Java语言的基础特性,还涵盖了面向对象设计、多线程编程、GUI开发...
Java中的枚举类型可以用来表示这些状态,并通过条件判断进行状态切换。游戏状态管理确保了游戏逻辑的清晰性和可维护性。 3. **游戏对象**:飞机、子弹、敌人等都是游戏对象,它们有自己的属性(如位置、速度、生命...
- **使用库**:Java社区中有许多专门用于实现有限状态机的库,如jFSM、Stateless等,它们提供了更高级的功能和抽象,可以简化开发过程。 在实际应用中,有限状态机可以帮助我们处理复杂的问题,例如网络协议解析中...
6. **状态管理**:游戏可能有多种状态,如开始、暂停、游戏结束等,这些状态的管理可以通过枚举类型或者布尔变量来实现。 7. **资源管理**:游戏可能涉及到图片、音频等资源,Java提供`ImageIcon`类来加载和显示...