CPS-875 - Getting issue details... STATUS

State Machine

State Machines are a model used in computing to define the current state of the system, and the possible next state which it may transition to.

These machines can only be in one state at any given time.

Enum State Machine

The purpose of implementing a state machine using Enums is so that the state doesn't have to be explicitly set.

Instead, the logic is provided on how to transition from one to the next.

State Machine Transition
public enum CmHandleState {

    Advised {
        @Override
        public CmHandleState nextState() {
            return Locked;
        }

        @Override
        public String cmHandleState() {
            return "ADVISED";
        }
    },
    Locked {
        @Override
        public CmHandleState nextState() {
            return Ready;
        }

        @Override
        public String cmHandleState() {
            return "LOCKED";
        }
    },
    Ready {
        @Override
        public CmHandleState nextState() {
            return this;
        }

        @Override
        public String cmHandleState() {
            return "READY";
        }
    };

    public abstract CmHandleState nextState();
    public abstract String cmHandleState();

The state machine transitions are implemented using the enum's abstract nextState() method.

PreviousState() can also be implemented, so if the state needs to go from 'READY' to 'LOCKED' for example, this can also be done without having to be explicitly stated.

Advantages of Enum Stating Machine

  • Easy to Implement
  • Can provide the logic for the transition implementation without having to explicitly state it.
  • Cleaner and Easier to read which states can be transitioned to other states.
  • Easily extendable if future states are to be added.

Disadvantages

  • Due to how state machine works, transitions are pre defined between states, based on the diagram here (CPS-799 Spike: Define states and state handling for CM handle), "LOCKED" and "DELETED" states can be accessed from multiple previous states. Meaning they may have to be defined explicitly to jump between these states. Defeating the main purpose of implementing the state machine. 
  • No labels