# State machine mit enum



## ryane (11. Okt 2010)

Hallo leute , 
ich brauche mal eure hilfe. Ich möchte ein automat bauen der 4 zustände hat und möchte dafür alle meine state in eine enum definieren und dann mit switch case hin und her gehen . 
hat jemand da ein beispiel für mich ? konnte im net nicht fündig werden .
Danke


----------



## Gast2 (11. Okt 2010)

```
public enum State {
    STATE1, STATE2, STATE3, STATE4
}
```

in deinem Programm dann:


```
switch (myState) {
    case STATE1:
        /** do something */
        break;
    usw.
}
```

Oder was war die Frage?


----------



## ryane (11. Okt 2010)

Danke aber warum jetzt myState in der switch anweisung ?
muss ich dann die Klasse enum extra schreiben und dann mit extends aufrufen oder kann ich auch gleich enum innerhalb eine vorhandene Klasse definieren ?


----------



## Gast2 (11. Okt 2010)

ryane hat gesagt.:


> Danke aber warum jetzt myState in der switch anweisung ?


myNum ist der aktuelle Status deines Automaten.



ryane hat gesagt.:


> muss ich dann die Klasse enum extra schreiben und dann mit extends aufrufen oder kann ich auch gleich enum innerhalb eine vorhandene Klasse definieren ?


Du kannst entweder dein Enum in einer Extra datei definieren, dann kannst du einfach per State.STATE1 zugreifen. Oder du definierst das enum in einer existierenden Klasse:

```
public class Automat {
    enum State {
        STATE1, STATE2, ...
    }

    /** dein code */
}
```
Dann kannst du innerhalb der Klasser per State.STATE1 zugreifen, und von außerhalb über Automat.State.STATE1.


----------



## ryane (11. Okt 2010)

habe den folgenden code geschrieben aber der geht nicht: sorry , bin ja neu in Programmieren

```
public class Automat {
 private enum STATE_TYPE {STATE1 ,STATE2,STATE3, STATE4 }
 private STATE_TYPE myState;
 switch (myState) {
    case  STATE1:
        //something
        // wie weise ich dem Automat dem nächten state hier ?
        // soo etwa : myState=STATE4
        break;
    case STATE3:
        break;
    case STATE4:    
}
 
 
}
```


----------



## Gast2 (11. Okt 2010)

Dein switch kann nicht einfach so im nirgendwo stehen 


```
public class Automat {
    private enum STATE_TYPE {
        STATE1, STATE2, STATE3, STATE4
    }

    private STATE_TYPE myState;

    public void nextState() {
        switch (myState) {
            case STATE1:
                //something
                // wie weise ich dem Automat dem nächten state hier ?
                myState = STATE_TYPE.STATE2;
                break;
            case STATE3:
                break;
            case STATE4:
        }
    }
}
```


----------



## Landei (11. Okt 2010)

switch kann nicht einfach so im Klassenkörper stehen, sondern in eine Methode. 

Mal aus'm Kopp (ungetestet):

```
import java.util.Random;

public class Automat {
 private enum STATE_TYPE {STATE1 ,STATE2,STATE3, STATE4, END }
 private static Random random = new Random();  

 public static void main(String[] args) { 
     STATE_TYPE myState = STATE_TYPE.STATE1;
     while(myState != STATE_TYPE.END) {
          System.out.println("State is " + myState);
          switch (myState) {
              case  STATE1: myState = STATE2;  break;
              case  STATE2: myState = STATE3;  break;
              case  STATE3: myState = STATE4;  break;
              case  STATE4: 
                    //damit es ein wenig interessanter wird, etwas Zufall:
                    int r = random.nextInt(3);
                    if (r == 0) {
                          myState = STATE1;
                    } else if (r == 1) {
                          myState = STATE3;
                    } else {
                          myState = END;
                    }
                    break;
              default : break;  
           }
       }
   }
}
```
Ich hab mal alles ganz simpel in main gepackt, man kann es auch hübscher mit einer Automaten-Instanz und so machen.


----------



## ryane (11. Okt 2010)

Ich danke euch für euere Hilfe ich habe eben probiert uns es funktioniert . nun  eine letzte frage 
@Landei


> man kann es auch hübscher mit einer Automaten-Instanz und so machen.


was meinst du damit ?


----------



## Marcinek (11. Okt 2010)

Ich glaube es soll etwas in Anlehnung an das Zustands-Muster (State-Pattern) sein.


----------



## Landei (12. Okt 2010)

Ich meinte, man kann auch in main mit new ein Automaten-Objekt ("Instanz") erzeugen, und dort "weiterarbeiten", was etwas objektorientierter wäre. Generell ist es kein guter Stil, einfach alles in die main-Methode zu quetschen, sondern man versucht normalerweise, die einzelnen Schritte mittels Objekten und deren Methoden sinnvoll zu gliedern (der Code von EikeB geht in diese Richtung, es fehlt aber noch der richtige Aufruf).


----------

