2015-10-16 6 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); 
    } 
} 

Так что мой вопрос, когда changeState происходит, состояние устанавливается в новое состояние, а затем его метод ввода() вызывается. Но что происходит с текущим состоянием, то есть currentState.changeState (...), что означает, что мы все еще находимся в вызове метода предыдущего состояния. Этот метод остается в стеке до тех пор, пока он не перейдет ко всему его коду и не вернется (то есть есть два состояния в памяти - предыдущее состояние (из-за его выполнения по-прежнему выполняется), а также новое состояние и его вызов вызова метода ввода.) или те, что предыдущее состояние стало помечено для сбора мусора, поскольку указатель на него больше не указатель, и возможно (маловероятно, но возможно), что метод может быть собран в мусор, прежде чем метод сможет закончить выполнение?

Как я уже сказал, этот вопрос более глубок и связан с тем, как работает JVM, и выполняется сбор мусора/указателя. Все ответы приветствуются, но мне хотелось бы, если это возможно, ссылки на статьи об этом. Спасибо всем

+0

Концептуально говоря, это, вероятно, не то, как я вообще буду заниматься внедрением FSM ... Я признаю, я очень озадачен этим вопросом. Что именно вы спрашиваете здесь? Вы спрашиваете, что произойдет, если ваш вызов 'changeState' был вызван как есть (если он был действителен, а это действительно так)? – Makoto

ответ

1

Так что мой вопрос в том, когда возникает changeState, State устанавливается в новое состояние, а затем вызывается его метод enter(). Но что происходит с текущим состоянием, то есть currentState.changeState (...), что означает, что мы все еще находимся в вызове метода предыдущего состояния. Этот метод остается в стеке до тех пор, пока он не перейдет ко всему его коду и не вернется (то есть есть два состояния в памяти - предыдущее состояние (из-за его выполнения по-прежнему выполняется), а также новое состояние и его вызов вызова метода ввода.)

Исправить.

или те, предыдущее состояние стало помечаются для сбора мусора, так как нет указателя, ссылающегося на него больше

Он по-прежнему выполняется, поэтому он не может быть сборщиком мусора.

и возможно (маловероятно, но возможно), что метод может быть собран в мусор, прежде чем метод может закончить выполнение?

Нет. Методы не собираются с грохотом.

Это неправильный способ реализации FSM на Java. С одной стороны, если есть достаточно переходов, вы получите StackOverflowError. Должен быть цикл, который вызывает вызов enter() в следующем состоянии, пока он не станет «законченным», и должен быть метод setNextState(), который вызывается в конце каждого метода enter(), чтобы определить, что должно произойти дальше. Нынешнее состояние само по себе не должно вызывать метод нового enter() нового состояния.

+0

Спасибо. Я не совсем реализовал свой путь таким образом, хотя и не сильно отличался. Mine, я только что получил новое состояние, и вместо метода enter() у меня был конструктор для состояния.Возможно, это не лучший способ реализовать его, но поскольку андроид, похоже, действительно не использует цикл, это затрудняло правильное обращение к следующей настройке состояний. Я использую машину состояний для своих просмотров, чтобы выбрать, какой вид отображать. Я предпочел, чтобы у меня было много разных классов, чтобы отобразить простой список или меню и т. Д. Государство выбирает, что показывать (также лучше, чем беспорядочное, если потом еще гнездо). Еще раз спасибо – Zero

+0

Текущее состояние не должно само назвать конструктор нового состояния либо по той же причине. – EJP

+0

Фактически, объект может иметь право на GC, пока метод в этом объекте все еще выполняется, пока слот для указателя 'this' больше никогда не используется байт-кодом метода См. [Когда объект получает право на сбор мусора?] (Http://blogs.msdn.com/b/oldnewthing/archive/2010/08/10/10048149.aspx) (что касается C#, но большинство JVMs аналогичны) для деталей. –

 Смежные вопросы

  • Нет связанных вопросов^_^