2015-10-16 64 views
-1

我的問題是關於錯誤預防,而不是關於讓某些工作。製作一個fsm,在一個狀態內改變狀態指針,到底發生了什麼。讓我發佈一些代碼,使我的問題更清楚。我會盡量保持最低限度使對方瞭解我的觀點:java指針和狀態機

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); 
    } 
} 

所以我的問題是,當改變狀態時,狀態設置爲一個新的國家,然後將其輸入()方法被調用。但是當前狀態會發生什麼,即currentState.changeState(...)意味着我們仍處於之前狀態的方法調用中。該方法是否保留在堆棧上,直到它遍歷所有代碼並返回(即內存中有兩個狀態 - 前一個狀態(因爲它的方法調用仍在執行)以及新狀態和它的enter方法調用正在執行。 )或者之前的狀態因爲沒有指向它的指針而被標記爲垃圾回收,並且在方法可以完成執行之前可能(不太可能,但可能)該方法可能被垃圾回收?

就像我說的,這個問題更深入,涉及到JVM的工作原理和垃圾收集/指針執行。歡迎所有回覆,但如果可能的話,我想鏈接到文章。謝謝大家

+0

從概念上講,這可能不是我如何執行FSM的方法......我承認,我對這個問題很困惑。你到底在問什麼?你是否問過如果你的'changeState'調用是按原樣調用會發生什麼(假設它是有效的,它真的不是)? – Makoto

回答

1

所以我的問題是,當changeState發生時,State被設置爲一個新的狀態,然後調用它的enter()方法。但是當前狀態會發生什麼,即currentState.changeState(...)意味着我們仍處於之前狀態的方法調用中。該方法是否保留在堆棧上,直到它遍歷所有代碼並返回(即內存中有兩個狀態 - 前一個狀態(因爲它的方法調用仍在執行)以及新狀態和它的enter方法調用正在執行。 )

正確。

或那些以前的狀態成爲標記爲垃圾回收,因爲沒有指針指向它了

它仍然在執行,因此它不能作爲垃圾回收。

它可能(不太可能,但可能)該方法可能會被垃圾回收之前,該方法可以完成執行?

編號方法不gargabe收集。

這不是在Java中實現FSM的正確方法。首先,如果有足夠的轉換,您將獲得StackOverflowError。應該有一個循環在下一個狀態保持調用enter(),直到它處於「完成」狀態,並且應該有一個setNextState()方法,在每個enter()方法的末尾調用以確定接下來應該發生什麼。當前狀態不應該自己調用新狀態的enter()方法。

+0

謝謝。儘管沒有太大的區別,但我並沒有像這樣執行我的操作。我的,我剛剛有了新的狀態,而不是一個enter()方法,我有一個狀態的構造函數。也許不是實現它的最好方法,但是由於android似乎並沒有真正使用循環,所以很難正確調用下一個狀態設置。我爲我的視圖使用狀態機,以選擇要顯示的視圖。我更喜歡它有許多不同的類,只是爲了顯示一個簡單的列表或菜單等。狀態選擇要顯示的內容(如果其他嵌套也比混亂更好)。再次感謝您 – Zero

+0

當前狀態不應該自己調用因爲相同的原因, – EJP

+0

實際上,一個對象可以符合GC的條件,而只要該'this'指針的槽不再被該方法的字節碼使用,該對象中的方法仍然在執行請參閱[什麼時候對象符合垃圾回收的條件?](http://blogs.msdn.com/b/oldnewthing/archive/2010/08/10/10048149.aspx)(這是關於C#的,但大多數JVM細節相似)。 –