Как создать простой конечный автомат в java

В настоящее время я изучаю Java и хочу знать, как управлять состоянием в OO-способе. Я применил приложение Pong. Если бы я хотел несколько состояний, таких как геймплей и меню, и каждое из этих состояний должно было запускать, останавливать и запускать, как бы я это достиг и как переключаться между этими состояниями.

Я знаю, что могу просто добавить большое предложение switch, но что лучший способ реализовать это?

Я хочу иметь возможность переключиться в состояние меню в состоянии игрового процесса и наоборот.

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Pong extends Applet implements Runnable, KeyListener{

    public void start ()
    {
        setSize(screen);
        setFocusable(true);
        Thread th = new Thread (this);
        th.start ();
    }

    public void stop()
    {
    }
    //Etc..
}

Ответы

Ответ 1

Вы можете смоделировать базовый FSM (конечный автомат) с использованием перечислений:

public enum State {

    ONE {
        @Override
        public Set<State> possibleFollowUps() {
            return EnumSet.of(TWO, THREE);
        }
    },

    TWO {
        @Override
        public Set<State> possibleFollowUps() {
            return EnumSet.of(THREE);
        }
    },

    THREE // final state 

    ;
    public Set<State> possibleFollowUps() {
        return EnumSet.noneOf(State.class);
    }

}

В то время как код для создания этого будет очень многословным, если ситуация усложнится, приятно отметить, что вы получаете безопасность во время компиляции, безопасность потоков и высокую производительность.