MINT üben

Datenkapselung mit get und set

Dreißig Übungen zu Getter, Setter und private — von AFB I bis AFB III.

Dein Fortschritt:
0 / 0 Aufgaben
1

Übungsaufgaben

Dreißig Übungen in gemischter Reihenfolge — du klickst, ziehst, ordnest, rechnest und knobelst. Jede Übung gibt dir sofort eine Rückmeldung, und zu jeder Aufgabe gibt es zwei gestufte Tipps: Der erste zeigt die Richtung, der zweite den entscheidenden Schritt. Die Chips zeigen das Anforderungsniveau: AFB I heißt wiedergeben und direkt anwenden, AFB II selbst entscheiden und verknüpfen, AFB III begründen, beurteilen oder eine Falle durchschauen. Aufgaben mit dem Chip Mix verbinden Wissen aus früheren Unterkapiteln, bei Trick steckt eine Falle drin. Fährst du über ein unterstrichenes Arbeitswort, siehst du, was es genau von dir verlangt.

A1
Regeln am Thermostat
AFB I

Ein Thermostat speichert seine Solltemperatur im Attribut soll. Wende die Regeln der Datenkapselung an: Stelle in jedem Satz die farbig hinterlegten Wörter so ein, dass er stimmt.

Klicke auf die farbig hinterlegten Wörter: Jeder Klick schaltet zur nächsten Möglichkeit weiter. Stelle jeden Satz so ein, dass er physikalisch stimmt. Tastatur: Tab zum Wort, Enter/Leertaste oder ↑/↓ schaltet um.

Das Attribut soll ist ; eine andere Klasse kann es deshalb ändern.

Eine Methode, die den Wert zurückgibt, heißt ; sie hat und .

Ein schreibt den neuen Wert und ihn vorher, damit das Objekt nie in einem falschen Zustand ist.

Hat ein Attribut nur einen Getter und keinen Setter, ist es nach dem Erzeugen .

Weil soll private ist, führt der Weg von außen nur über Methoden. Ein Getter liefert einen Wert (Rückgabetyp, kein Parameter), ein Setter schreibt ihn (void, ein Parameter) und prüft ihn vorher. Ohne Setter bleibt ein Attribut nur lesbar.
Lies jeden Satz zuerst ganz und frage dich: Geht es um das Lesen oder um das Schreiben eines Werts?
Ein Getter beantwortet eine Frage nach dem Wert, ein Setter bekommt einen neuen Wert und entscheidet, ob er gültig ist.
A2
Zugriffe auf das Stadion
AFB II

Die Klasse Stadion hat die privaten Attribute plaetze und besucher sowie für beide einen Getter und einen Setter. s ist ein Objekt dieser Klasse. Ordne jede Zeile ein: Wo steht sie und wie greift sie zu — und liest sie einen Wert oder ändert sie ihn?

Ziehe jedes Kärtchen in das passende Feld — oder klicke es an und dann das Feld. Mit der Tastatur: Enter wählt ein Kärtchen, die Pfeiltasten schieben es von Feld zu Feld, Esc legt es zurück. Nach dem Prüfen heißt ↔: waagerecht falsch, ↕: senkrecht falsch.
In der Klasse selbst erreicht man private Attribute ohne Umweg. Von außen führt der erlaubte Weg über Getter (lesen) und Setter (ändern). Der direkte Zugriff mit s.besucher oder s.plaetze scheitert an private — das gilt für Lesen und Ändern gleichermaßen.
Stelle dir zuerst die Frage: Steht die Zeile in der Klasse Stadion oder in einer anderen Klasse, die nur das Objekt s benutzt?
Von außen kommt man an private Attribute nur über Methoden. Ein Punkt direkt vor dem Attributnamen (s.plaetze) ist der verbotene Weg.
A3
Der Kaffeeautomat im Lehrerzimmer
AFB III

Der Wassertank fasst 0 bis 2000 ml; tassen zählt die gekochten Tassen und ist nur lesbar. Zeige Schritt für Schritt, wie sich der Zustand des Automaten entwickelt, wenn das folgende Programm läuft.

public class Kaffeeautomat {
    private int wasser;
    private int tassen;

    public Kaffeeautomat() {
        wasser = 1000;
        tassen = 0;
    }

    public void setWasser(int ml) {
        if (ml >= 0 && ml <= 2000) {
            wasser = ml;
        }
    }

    public void nachfuellen(int ml) {
        setWasser(wasser + ml);
    }

    public boolean kaffeeKochen() {
        if (wasser >= 150) {
            wasser = wasser - 150;
            tassen = tassen + 1;
            return true;
        }
        return false;
    }

    public int getWasser() {
        return wasser;
    }

    public int getTassen() {
        return tassen;
    }
}
Kaffeeautomat k = new Kaffeeautomat();
k.nachfuellen(1200);
k.kaffeeKochen();  // viermal hintereinander
k.kaffeeKochen();
k.kaffeeKochen();
k.kaffeeKochen();
k.setWasser(-100);
k.kaffeeKochen();  // dreimal hintereinander
k.kaffeeKochen();
k.kaffeeKochen();
k.nachfuellen(1900);
Rechne die Kette Schritt für Schritt: Erst wenn ein Schritt stimmt, wird der nächste freigeschaltet. Enter prüft.
  1. Wert von k.getWasser() direkt nach nachfuellen(1200) ml
  2. Wert von k.getTassen() nach allen kaffeeKochen-Aufrufen Tassen
  3. Wert von k.getWasser() ganz am Ende ml
  4. Transfer: Wie viele Tassen lassen sich mit dem Endstand noch höchstens kochen? Tassen
Die Falle steckt im ersten Schritt: 1000 + 1200 = 2200 ist ungültig, also lehnt der Setter ab — der Tank bleibt bei 1000, er wird nicht auf 2000 aufgefüllt. Dann 4 Tassen (1000 → 400), setWasser(−100) wird abgelehnt, 2 weitere Tassen (400 → 250 → 100), die siebte scheitert. Am Ende 100 + 1900 = 2000, das ist erlaubt. 2000 / 150 = 13 Rest 50. tassen hat keinen Setter — nur kaffeeKochen() kann den Zähler erhöhen.
Ansatz: Prüfe bei jedem nachfuellen, ob die Summe im erlaubten Bereich liegt. Nur dann ändert sich wasser.
Weiter: Jede erfolgreiche Tasse braucht mindestens 150 ml. Bei 100 ml liefert kaffeeKochen() false und ändert nichts.