studyklar
GdI 2 · Übungsblatt 8 · Aufgabe 1

Ampel mit Enum: die Phasen reihum schalten

Eine Ampel kennt genau vier Phasen und schaltet immer in derselben Reihenfolge weiter. Ein Enum ist dafür der passende Datentyp: Er erlaubt nur diese vier Werte. Rechts stehen die drei Dateien des Programms, die Zeilen zum aktuellen Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 1

Es sollen die Phasen einer Ampel in ihrer Reihenfolge ausgegeben werden. Programmieren Sie hierzu ein Enum (siehe Vorlesung 5) mit den verschiedenen Ampelphasen als Werte (rot, rot-gelb, grün, gelb). Erstellen Sie eine Klasse Ampel, die jeweils eine aktuelle Phase hat. Eine Methode „schalte“ soll bei jedem Aufruf die nächste Phase zuweisen und auf der Konsole ausgeben.

Gesucht ist ein Programm mit drei Teilen: ein Enum für die Phasen, eine Klasse Ampel mit der aktuellen Phase und eine Methode schalte. Jeder Aufruf von schalte setzt die nächste Phase und gibt sie aus. Nach Gelb kommt wieder Rot.

Merke: Ein Enum (Aufzählungstyp) ist ein Datentyp mit einer festen Liste von Werten. Eine Variable dieses Typs kann nur einen dieser Werte haben, keinen anderen.
  1. Das Enum AmpelPhase mit den vier Phasen schreiben.
  2. Die Klasse Ampel mit dem Attribut für die aktuelle Phase.
  3. Die Methode schalte: nächste Phase wählen, dann ausgeben.
  4. In AmpelApp eine Ampel anlegen und mehrmals schalten.

Das Enum AmpelPhase

public enum AmpelPhase {    ROT,    ROT_GELB,    GRUEN,    GELB;}

Statt class steht hier enum. In den geschweiften Klammern stehen alle erlaubten Werte, durch Kommas getrennt. Die Werte schreibt man meist groß. Ein Bindestrich ist in Java-Namen nicht erlaubt, deshalb heißt rot-gelb hier ROT_GELB. Statt „ü“ steht UE, wie in Java-Namen üblich.

Warum kein String wie "rot"? In einen String passt jeder Text, auch ein Tippfehler wie "rto". Den merkt erst das laufende Programm, oder gar keiner. Bei einem Enum meldet der Compiler einen falschen Namen sofort.

Aus Vorlesung 5, Folie 33 („Besser: Enum (Aufzählungstyp)“): Ein Enum steht meist in einer eigenen Datei wie eine Klasse; braucht es nur eine Klasse, darf es auch in ihr stehen. Auf einen Wert greift man mit dem Namen des Enums zu: AmpelPhase.ROT.

Die Klasse Ampel merkt sich die aktuelle Phase

public class Ampel {     private AmpelPhase phase = AmpelPhase.GELB;

Das Attribut phase hat den Typ AmpelPhase. Es kann also nur einen der vier Werte haben. Es ist private: Nur die Ampel selbst ändert ihre Phase, und zwar über schalte.

Der Startwert ist GELB. Der Grund: Der erste Aufruf von schalte setzt die Phase nach Gelb, also Rot. So beginnt die Ausgabe mit der ersten Phase der Aufgabe. Einen eigenen Konstruktor braucht die Klasse nicht; ohne ihn legt Java new Ampel() mit diesem Startwert an.

Aus Blatt 5, Aufgabe 1 („Eine eigene Klasse Tier mit Konstruktor und toString“): Eine Klasse hat Attribute (was ein Objekt sich merkt) und Methoden (was es tun kann). new legt ein Objekt der Klasse an.
Noch 4 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Ampel-Programm

drei Dateien in einem Ordner

Abbildung 1Ampel-Programm

drei Dateien in einem Ordner

public enum AmpelPhase {    ROT,    ROT_GELB,    GRUEN,    GELB;}
LegendeAmpelPhase.java

Abbildung 1Ampel-Programm

drei Dateien in einem Ordner

public class Ampel {     private AmpelPhase phase = AmpelPhase.GELB;     public void schalte() {        phase = switch (phase) {            case ROT -> AmpelPhase.ROT_GELB;            case ROT_GELB -> AmpelPhase.GRUEN;            case GRUEN -> AmpelPhase.GELB;            case GELB -> AmpelPhase.ROT;        };        System.out.println("Aktuelle Phase: " + phase);    }}
LegendeAmpel.java

Abbildung 1Ampel-Programm

drei Dateien in einem Ordner

public class AmpelApp {     public static void main(String[] args) {        Ampel ampel = new Ampel();         for (int i = 0; i < 6; i++) {            ampel.schalte();        }    }}
LegendeAmpelApp.java und darüber die beiden anderen Dateien.