¿Hay un beneficio de usar una enumeración en un solo FSM sobre el uso de una cadena?

user9549420:

Quiero crear una máquina de estados finitos y la mayor parte del código de ejemplo que puedo encontrar usos enumeraciones y me estaba preguntando si se le da una ventaja sobre simplemente mediante una cadena o int para almacenar el estado.

Con enumeración:

TrafficLight clase {{enum Estado ROJO, AMARILLO, VERDE};

State state = State.GREEN;

public void iterate() throws InterruptedException {
    switch (this.state) {
    case RED:
        System.out.println("RED");
        Thread.sleep(1000);
        this.state = State.GREEN;
        break;

    case GREEN:
        System.out.println("GREEN");
        Thread.sleep(1000);
        this.state = State.YELLOW;
        break;

    case YELLOW:
        System.out.println("YELLOW");
        Thread.sleep(1000);
        this.state = State.RED;
        break;
    }

}

public class Principal {

public static void main(final String[] args) throws InterruptedException {

    final TrafficLight a = new TrafficLight();
    while (true) {
        a.iterate();
    }
}

}

con cadena

TrafficLight public class {

String state = "GREEN";

public void iterate() throws InterruptedException {
    switch (state) {
        case "RED":
            System.out.println("RED");
            Thread.sleep(1000);
            state = "GREEN";
            break;

        case "GREEN":
            System.out.println("GREEN");
            Thread.sleep(1000);
            state = "YELLOW";
            break;

        case "YELLOW":
            System.out.println("YELLOW");
            Thread.sleep(1000);
            state = "RED";
            break;
    }
}

}

(Ambos utilizan el mismo método principal)

Ambos parecen ser exactamente el mismo que me estoy preguntando si hay algún caso en que las enumeraciones son mejores o una cadena no funcionaría.

Gracias.

davidxxx:

La principal ventaja de Enummás de String: esto se escribe más específicamente como Enumespecifica los valores posibles.
Esto hace que su código tanto más robusto y también mejor documentado.
Para una FSM y los valores más generalmente delimitadas, que es lo que busca.
Sin embargo, para los problemas / dominios donde los valores posibles se definen en tiempo de ejecución y no en tiempo de compilación (recuperar de una base de datos o lo que sea), Enumno es el mejor candidato.

Ejemplo del interés de enumeración en su caso

Con enumeración, que no se compilará como REDDno está declarado en la Stateclase de enumeración:

case REDD:
    System.out.println("RED");
    Thread.sleep(1000);
    this.state = State.GREEN;
    break;

Pero con la cadena, se compilará y simplemente no funcionan como se esperaba:

case "REDD":
    System.out.println("RED");
    Thread.sleep(1000);
    state = "GREEN";
    break;

Los valores enumerados son instancias de la clase enum con los valores propios para campos de instancia, sino también habilidades primordiales para los métodos de instancia

Esta es otra ventaja de enum en el FSM o cualquier dominio en el que los valores enumerados están asociados a propiedades / procesamientos específicos y donde de acuerdo con valor enumerado, los valores de campos o el comportamiento método podrían diferir.

Por ejemplo, aquí se especifica el comportamiento para conseguir la transición siguiente:

enum State {
    YELLOW(){
        @Override
        public State next() {
            return RED;
        }
    },
    RED(){
        @Override
        public State next() {
            return GREEN;
        }
    },
    GREEN(){
        @Override
        public State next() {
            return YELLOW;
        }
    };
    public abstract State next();
}

Ahora, la enumeración tiene suficiente lógica para hacer la switchdeclaración no se necesita más tiempo:

public void iterate() throws InterruptedException {
    System.out.println(state);
    Thread.sleep(1000);         
    state = state.next();
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=206612&siteId=1
Recomendado
Clasificación