enummap结合枚举实现o(1)状态机路由,通过静态final enummap存储状态转移规则或动作映射,确保类型安全、零gc、线程安全且启动即就绪。

用 EnumMap 结合枚举类实现高性能状态机路由,核心是把“状态 → 合法转移目标”或“状态 → 处理动作”固化为内存中可直接索引的结构,避开反射、if-else 或哈希计算,做到 O(1) 查找、零 GC 开销、启动即就绪。
选对状态枚举:穷尽、不可变、顺序明确
状态必须定义为 enum,且覆盖所有可能取值,不能运行时增删。例如:
- 设备状态:ONLINE、OFFLINE、UPDATING、REBOOTING、ERROR_LOCKED
- 订单流程:CREATED、PAID、SHIPPED、DELIVERED、REFUNDED
- 审批节点:DRAFT、SUBMITTED、APPROVED、REJECTED、ARCHIVED
避免用 int 或 String 表示状态——会丢失类型安全、编译期校验,也破坏 EnumMap 的 ordinal 索引能力。
用 EnumMap 存状态转移规则:键是当前状态,值是允许的目标状态集
每个状态对应的合法流转目标,用 EnumSet 存储,整个映射用 EnumMap 管理:
enum OrderStatus { CREATED, PAID, SHIPPED, DELIVERED, REFUNDED }
private static final EnumMap<orderstatus enumset>> TRANSITIONS = new EnumMap(OrderStatus.class);
static {
TRANSITIONS.put(OrderStatus.CREATED, EnumSet.of(OrderStatus.PAID));
TRANSITIONS.put(OrderStatus.PAID, EnumSet.of(OrderStatus.SHIPPED, OrderStatus.REFUNDED));
TRANSITIONS.put(OrderStatus.SHIPPED, EnumSet.of(OrderStatus.DELIVERED, OrderStatus.REFUNDED));
TRANSITIONS.put(OrderStatus.DELIVERED, EnumSet.of(OrderStatus.REFUNDED));
TRANSITIONS.put(OrderStatus.REFUNDED, EnumSet.noneOf(OrderStatus.class));
}</orderstatus>
校验是否允许从 A 转到 B,只需一行:
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
boolean canTransition = TRANSITIONS.get(current).contains(next);
绑定处理策略:状态直连动作或处理器实例
高频路由场景下,不建议每次 get() 后判空再分支,而是直接映射到策略对象或动作枚举:
- 映射到动作枚举(轻量):
EnumMap<orderstatus routeaction></orderstatus> - 映射到函数式接口(灵活):
EnumMap<orderstatus supplier>></orderstatus> - 映射到策略类实例(可扩展):
EnumMap<orderstatus orderhandler></orderstatus>
例如:
enum RouteAction { FORWARD_IMMEDIATE, QUEUE_THEN_RETRY, DROP_WITH_LOG, ESCALATE_TO_CLOUD }
private static final EnumMap<orderstatus routeaction> ACTION_TABLE = new EnumMap(OrderStatus.class);
static {
ACTION_TABLE.put(OrderStatus.PAID, RouteAction.FORWARD_IMMEDIATE);
ACTION_TABLE.put(OrderStatus.SHIPPED, RouteAction.FORWARD_IMMEDIATE);
ACTION_TABLE.put(OrderStatus.REFUNDED, RouteAction.DROP_WITH_LOG);
}</orderstatus>
保障线程安全与初始化可靠性
静态 final 的 EnumMap 在类加载时初始化,天然线程安全(内容不可变),但要注意:
- 构造必须传入枚举 Class,如
new EnumMap(OrderStatus.class);仅靠泛型无法推断 - 多线程写入(极少场景)需外部同步,读操作完全无锁
- 使用
containsKey()判断 key 是否存在,避免用get() == null混淆“不存在”和“值为 null” - Java 9+ 可用
EnumMap.of()快速构建小规模映射,简洁且类型安全
这套结构不是缓存,而是编译期确定、运行时常驻的内存路由表——查得快、占得少、扛得住高频并发读。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










