我正在编写一个 Java 模拟应用程序,其中有很多实体要模拟。这些实体中的每一个在系统中的任何时候都具有一定的状态。对此类实体建模的一种可能且自然的方法是使用 state (or state machine)图案。问题是如果有很多状态切换,它会在运行时创建很多对象,这可能会导致系统性能下降。我有哪些设计选择?我希望性能成为继可维护性之后的主要标准。
谢谢
最佳答案
以下代码将为您提供高性能(~10ns/事件)零运行时 GC 状态机实现。只要你在系统或组件中有状态的概念,就使用显式状态机,这不仅使代码干净和可扩展,而且让人们(甚至不是程序员)立即看到系统在做什么,而不必深入研究大量回调:
abstract class Machine {
enum State {
ERROR,
INITIAL,
STATE_0,
STATE_1,
STATE_2;
}
enum Event {
EVENT_0,
EVENT_1,
EVENT_2;
}
public static final int[][] fsm;
static {
fsm = new int[State.values().length][];
for (State s: State.values()) {
fsm[s.ordinal()] = new int[Event.values().length];
}
}
protected State state = State.INITIAL;
// child class constructor example
// public Machine() {
// // specify allowed transitions
// fsm[State.INITIAL.ordinal()][Event.EVENT_0.ordinal()] = State.STATE_0.ordinal();
// fsm[State.STATE_0.ordinal()][Event.EVENT_0.ordinal()] = State.STATE_0.ordinal();
// fsm[State.STATE_0.ordinal()][Event.EVENT_1.ordinal()] = State.STATE_1.ordinal();
// fsm[State.STATE_1.ordinal()][Event.EVENT_1.ordinal()] = State.STATE_1.ordinal();
// fsm[State.STATE_1.ordinal()][Event.EVENT_2.ordinal()] = State.STATE_2.ordinal();
// fsm[State.STATE_1.ordinal()][Event.EVENT_0.ordinal()] = State.STATE_0.ordinal();
// fsm[State.STATE_2.ordinal()][Event.EVENT_2.ordinal()] = State.STATE_2.ordinal();
// fsm[State.STATE_2.ordinal()][Event.EVENT_1.ordinal()] = State.STATE_1.ordinal();
// fsm[State.STATE_2.ordinal()][Event.EVENT_0.ordinal()] = State.STATE_0.ordinal();
// }
public final void onEvent(Event event) {
final State next = State.values()[ fsm[state.ordinal()][event.ordinal()] ];
if (next == State.ERROR) throw new RuntimeException("invalid state transition");
if (acceptEvent(event)) {
final State prev = state;
state = next;
handleEvent(prev, event);
}
}
public abstract boolean acceptEvent(Event event);
public abstract void handleEvent(State prev, Event event);
}
如果将 fsm 替换为大小为 S*E 的单维数组,它还将改善状态机的缓存邻近特性。
关于java - java中的高效状态机模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13177347/