java指针和状态机

java指针和状态机,java,garbage-collection,state-machine,Java,Garbage Collection,State Machine,我的问题更多的是关于错误预防,而不是让某些东西发挥作用。制作一个fsm,在一个状态中改变状态指针,到底发生了什么。让我发布一些代码,让我的问题更清楚。我将尽量保持最低限度,以便让大家了解我的观点: class foo{ abstract fsm { abstract void enter(); final void changeState(fsm state) { State = state; State.enter() } } stat

我的问题更多的是关于错误预防,而不是让某些东西发挥作用。制作一个fsm,在一个状态中改变状态指针,到底发生了什么。让我发布一些代码,让我的问题更清楚。我将尽量保持最低限度,以便让大家了解我的观点:

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被设置为一个新的状态,然后调用它的enter()方法。但是当前状态发生了什么,即currentState.changeState(…),这意味着我们仍然处于前一个状态的方法调用中。该方法是否保留在堆栈上,直到它遍历所有代码并返回(即内存中有两种状态—前一种状态(因为其方法调用仍在执行)和新状态及其enter方法调用正在执行。)或者,由于不再有指向该状态的指针,以前的状态被标记为垃圾收集,并且该方法可能(不太可能,但可能)在该方法完成执行之前被垃圾收集

正如我所说的,这个问题更加深入和复杂,涉及JVM如何工作,以及垃圾收集/指针执行。欢迎所有回复,但如果可能的话,我想链接到这方面的文章。谢谢大家

所以我的问题是,当changeState发生时,State被设置为一个新的状态,然后调用它的enter()方法。但是当前状态发生了什么,即currentState.changeState(…),这意味着我们仍然处于前一个状态的方法调用中。该方法是否保留在堆栈上,直到它遍历所有代码并返回(即内存中有两种状态—前一种状态(因为其方法调用仍在执行)和新状态及其enter方法调用正在执行。)

或者,由于不再有指针指向以前的状态,因此这些状态被标记为垃圾收集

它仍在执行,因此无法对其进行垃圾收集

而且有可能(不太可能,但可能)在方法完成执行之前对其进行垃圾收集

没有。方法没有收集


这不是在Java中实现FSM的正确方法。首先,如果有足够的转换,您将得到一个
stackoverflowerrror
。应该有一个循环在下一个状态上不断调用
enter()
,直到它成为“完成”状态,并且应该有一个
setNextState()
方法,该方法在每个
enter()
方法的末尾被调用,以确定接下来应该发生什么。当前状态本身不应该调用新状态的
enter()
方法。

从概念上讲,这可能根本不是我实现FSM的方式……我承认,我对这个问题非常困惑。你到底在问什么?您是否在问如果您的
changeState
调用被按原样调用会发生什么情况(假设它是有效的,但实际上并非如此)?谢谢。我并没有以这种方式实现我的方法,尽管没有太大的不同。我的,我只是有一个新的状态,而不是enter()方法,我有一个状态的构造函数。也许不是实现它的最佳方式,但由于android似乎没有真正使用循环,因此很难正确调用next State设置。我正在使用状态机来显示视图,以选择要显示的视图。我更喜欢它,而不是仅仅为了显示一个简单的列表或菜单等而使用许多不同的类。。国家选择展示什么(也比凌乱的if-then-else嵌套要好。再次感谢您,出于同样的原因,当前状态本身也不应该调用新状态的构造函数。事实上,只要方法的字节不再使用
this
指针的插槽,当该对象中的方法仍在执行时,该对象就可以符合GC的条件详细信息请参见(关于C#,但大多数JVM都是类似的)。