Vergleich von Enums gibt inkorrekte Werte

chaostheory

Bekanntes Mitglied
Hallo,
ich schreibe momentan ein 2D-Spiel. Ich nutze ein Enum, dass den aktuellen Stand des Spiels angibt: MENU, GAME, SCORE und END
Java:
public enum GameStatus {
	MENU(0),
	GAME(1),
	SCORE(2),
	END(3);
	
	private int id;
	
	GameStatus(int id) {
		this.id = id;
	}
	
	int getId() {
		return id;
	}
}

Die Klasse Main besitzt eine Instanzvariable, die den aktuellen Status speichert und auf die alle anderen Klassen zugreifen.
Die Klasse Draw überprüft nun den Status und zeichnet dementsprechend den Bildschirm.
Java:
public void draw() {
		switch(main.getStatus()) {
			case MENU:	drawMenu();
			case GAME:	drawGame();
			case SCORE:	drawScore();
		}		
	}

Ich habe festgestellt, dass am Anfang der Status zwar korrekt auf MENU steht, im switch-Block aber trotzdem alle drei Methoden aufgerufen werden! Nun werden alle drei Bildschirme übereinander gezeichnet, was das Spiel logischerweise ungenießbar macht. Drücke ich dann die Start-Taste wird der Status auf GAME gestellt und korrekterweise nur drawGame() aufgerufen.

Habe ich da irgendwas falsch gemacht?

Anmerkung:
Die Klasse Draw implementiert Runnable und wird als Thread von Main aufgerufen. Aber ich denke nicht, dass das was damit zu tun haben könnte, oder?
 
Nein, die anderen Fälle werden nicht geprüft (dann wären die break auch obsolet 😉 ). Die cases bestimmen nur den "Einstiegspunkt".
 
chaostheory, das Interessante ist eben, dass man "fall throughs" machen kann.
Stellen wir uns vor, wir haben eine Bankingsoftware, welche so aussehen könnte:
Java:
switch (user.getType()) {
case User.ANONYMOUS:
    return SomeConstants.LOGIN;
case User.IDIOT:
    user.removeSomeMoney();
case User.NORMAL:
    return SomeConstants.OVERVIEW;
}
Wenn der User also nicht eingeloggt ist, wird er an den Login verwiesen. Nach einem [c]return[/c] brauchts natürlich kein [c]break[/c], da die Methode sowieso verlassen wird.
Wenn der User einfach irgendein normaler User ist, dann wird er auf seine Kundenübersicht weitergeleitet. Wenn er ein Idiot ist, dann wird noch etwas von seinem Geld abgebucht und dann - dank fall through - auch an die Übersicht weitergeleitet.
 

Zurück
Oben