java 指针和状态机
java pointers and state machine
我的问题更多是关于错误预防,而不是关于如何让某些东西工作。制作一个 fsm,改变一个状态内的状态指针,到底发生了什么。让我 post 一些代码让我的问题更清楚。我会尽量保持最低限度来表达我的观点:
class foo{
abstract fsm {
abstract void enter();
final void changeState(fsm state) { State = state; State.enter() }
}
state1 extends fsm ... implementation left out
state2 extends fsm... implementation left out
fsm State = null;
foo(){
State = new state1;
State.changeState(new state2);
}
}
所以我的问题是,当changeState发生时,State被设置为一个新的State,然后它的enter()方法被调用。但是当前状态会发生什么,即 currentState.changeState(...) 意味着我们仍处于先前状态的方法调用中。该方法是否保留在堆栈中,直到它遍历所有代码和 returns (即内存中有两种状态 - 先前状态(因为它的方法调用仍在执行)和新状态及其进入方法调用正在执行。)或者那些先前的状态被标记为垃圾收集,因为不再有指向它的指针,并且有可能(不太可能,但可能)该方法可能在方法完成执行之前被垃圾收集?
就像我说的,这个问题更深入和复杂,是关于 JVM 如何工作的,以及垃圾收集/指针执行。欢迎所有回复,但如果可能的话,我希望链接到与此相关的文章。谢谢大家
So my question is, when changeState occurs, State is set to a new State, and then its enter() method is called. But what happens to the current state, that is the currentState.changeState(...) meaning that we are still in a previous state's method's call. Does that method remain on the stack until it goes through all of its code and returns (that is there are two states in memory - the previous state(because of its method call still executing) and the new state and its enter method call executing.)
正确。
or those the previous state become flagged for garbage collection since there is no pointer pointing to it anymore
它仍在执行中,因此无法进行垃圾回收。
and it is possible (unlikely, but possible) that the method may be garbage collected before the method can finish executing?
没有。方法不是垃圾收集的。
这不是在 Java 中实现 FSM 的正确方法。一方面,如果有足够的转换,您将获得 WhosebugError
。应该有一个循环,在下一个状态上不断调用 enter()
直到它是 'finished' 状态,并且应该有一个 setNextState()
方法在每个 [=11] 结束时调用=] 方法来确定接下来会发生什么。当前状态本身不应调用新状态的 enter()
方法。
我的问题更多是关于错误预防,而不是关于如何让某些东西工作。制作一个 fsm,改变一个状态内的状态指针,到底发生了什么。让我 post 一些代码让我的问题更清楚。我会尽量保持最低限度来表达我的观点:
class foo{
abstract fsm {
abstract void enter();
final void changeState(fsm state) { State = state; State.enter() }
}
state1 extends fsm ... implementation left out
state2 extends fsm... implementation left out
fsm State = null;
foo(){
State = new state1;
State.changeState(new state2);
}
}
所以我的问题是,当changeState发生时,State被设置为一个新的State,然后它的enter()方法被调用。但是当前状态会发生什么,即 currentState.changeState(...) 意味着我们仍处于先前状态的方法调用中。该方法是否保留在堆栈中,直到它遍历所有代码和 returns (即内存中有两种状态 - 先前状态(因为它的方法调用仍在执行)和新状态及其进入方法调用正在执行。)或者那些先前的状态被标记为垃圾收集,因为不再有指向它的指针,并且有可能(不太可能,但可能)该方法可能在方法完成执行之前被垃圾收集?
就像我说的,这个问题更深入和复杂,是关于 JVM 如何工作的,以及垃圾收集/指针执行。欢迎所有回复,但如果可能的话,我希望链接到与此相关的文章。谢谢大家
So my question is, when changeState occurs, State is set to a new State, and then its enter() method is called. But what happens to the current state, that is the currentState.changeState(...) meaning that we are still in a previous state's method's call. Does that method remain on the stack until it goes through all of its code and returns (that is there are two states in memory - the previous state(because of its method call still executing) and the new state and its enter method call executing.)
正确。
or those the previous state become flagged for garbage collection since there is no pointer pointing to it anymore
它仍在执行中,因此无法进行垃圾回收。
and it is possible (unlikely, but possible) that the method may be garbage collected before the method can finish executing?
没有。方法不是垃圾收集的。
这不是在 Java 中实现 FSM 的正确方法。一方面,如果有足够的转换,您将获得 WhosebugError
。应该有一个循环,在下一个状态上不断调用 enter()
直到它是 'finished' 状态,并且应该有一个 setNextState()
方法在每个 [=11] 结束时调用=] 方法来确定接下来会发生什么。当前状态本身不应调用新状态的 enter()
方法。