MINT lernen

Kapselung mit get und set

Zwei Textaufgaben mit Hinweisen und Erwartungshorizont zu private, Gettern und prüfenden Settern.

Dein Fortschritt:
0 / 0 Aufgaben
1

Das Profil in der Skater-App

AFB I–II

In einer App für Skaterinnen und Skater legt jede Person ein Profil an. Der Benutzername wird bei der Anmeldung festgelegt und kann danach nicht mehr geändert werden. Das Alter muss zwischen 13 und 120 Jahren liegen; ungültige Angaben werden abgewiesen, der bisherige Wert bleibt. Ein neues Profil ist zunächst privat und hat das Alter 13.

Material 1: Klassenkarte Profil
Profil
  • - benutzername: Zeichenkette
  • - alter: Ganzzahl
  • - privat: Wahrheitswert
  • c Profil(benutzername: Zeichenkette)
  • + getBenutzername(): Zeichenkette
  • + getAlter(): Ganzzahl
  • + setAlter(alter: Ganzzahl)
  • + istPrivat(): Wahrheitswert
  • + setPrivat(privat: Wahrheitswert)
Alle Attribute sind privat.
Material 2: Profil.java (Ausschnitt)
public class Profil {
    private String benutzername;
    private int alter;
    private boolean privat;

    public Profil(String benutzername) {
        this.benutzername = benutzername;
        this.alter = 13;
        this.privat = true;
    }

    public int getAlter() {
        return alter;
    }

    // setAlter fehlt noch
}
Weitere Methoden sind weggelassen.
Material 3: Aufrufe in der App
Profil p = new Profil("skater_nils");
p.setAlter(12);
p.setAlter(15);
p.setPrivat(false);
p.setAlter(-3);
p.alter = 200;
Nils probiert sein neues Profil aus.
  1. Nenne für jedes Attribut, ob es von außen nur gelesen oder gelesen und geändert werden kann.
  2. Ergänze in Material 2 die Methode setAlter.
  3. Bestimme die Objektkarte von p nach den Zeilen 1 bis 5 aus Material 3 und gib an, wie javac auf Zeile 6 reagiert.
  4. Erläutere, warum benutzername einen Getter, aber keinen Setter hat.

Hinweise

Hinweis zu Aufgabe a)
Suche zu jedem Attribut in der Karte einen Getter (get… bzw. bei Wahrheitswerten ist…) und einen Setter (set…).
Hinweis zu Aufgabe b)
Ein Setter hat den Rückgabetyp void. Übernimm den Wert nur, wenn er im erlaubten Bereich liegt. Parameter und Attribut heißen gleich.
Hinweis zu Aufgabe c)
Starte mit den Werten aus dem Konstruktor und prüfe jeden Aufruf gegen die Regel. Darf App das Attribut direkt ansprechen?
Hinweis zu Aufgabe d)
Lies noch einmal, was im Text über den Benutzernamen steht. Wer braucht den Namen lesend – z. B. die Anzeige in der App?

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)

benutzername: nur lesen (getBenutzername). alter: lesen und ändern (getAlter, setAlter). privat: lesen und ändern (istPrivat, setPrivat).

Erwartungshorizont zu Aufgabe b)
public void setAlter(int alter) {
    if (alter >= 13 && alter <= 120) {
        this.alter = alter;
    }
}

Wichtig: void, Prüfung beider Grenzen mit &&, this.alter. Ungültige Werte werden nicht übernommen und nicht „zurechtgerückt“.

Erwartungshorizont zu Aufgabe c)
p: Profil
  • benutzername = "skater_nils"
  • alter = 15
  • privat = false

12 und −3 liegen außerhalb von 13 bis 120 und werden abgewiesen, 15 wird übernommen. setPrivat(false) ändert die Sichtbarkeit.

Zeile 6 übersetzt javac nicht: alter has private access in Profil. Auf das private Attribut darf nur die Klasse Profil selbst zugreifen – so kann niemand die Prüfung umgehen.

Erwartungshorizont zu Aufgabe d)

Laut Beschreibung wird der Benutzername einmal bei der Anmeldung festgelegt und darf danach nicht mehr geändert werden. Deshalb gibt es keinen Setter: Der Wert kommt nur über den Konstruktor ins Objekt. Lesen muss die App ihn aber, z. B. um ihn über Beiträgen anzuzeigen – dafür gibt es den Getter. So ist das Attribut „nur lesbar“. Wäre es public, könnte jeder Programmteil den Namen überschreiben.

2

Der Aufzug im Schulneubau

AFB II–III

Der Schulneubau hat die Stockwerke 0 bis 8 und einen Aufzug für höchstens 6 Personen. Die Informatik-AG simuliert den Aufzug in Java. Die erste Version (Material 1) kommt ohne Kapselung aus. Beim Testen (Material 2) erhält die AG die Ausgabe 12 -2 20.

In der AG wird außerdem gestritten: Soll einsteigen(9) bei einem leeren Aufzug einfach 6 Personen einsteigen lassen („kappen“) oder den Aufruf komplett abweisen?

Material 1: Erste Version der Klasse Aufzug
public class Aufzug {
    public int stockwerk;
    public int personen;
    public int maxPersonen;

    public Aufzug() {
        stockwerk = 0;
        personen = 0;
        maxPersonen = 6;
    }

    public void fahreZu(int ziel) {
        stockwerk = ziel;
    }

    public void einsteigen(int anzahl) {
        personen = personen + anzahl;
    }
}
Alle Attribute sind öffentlich.
Material 2: Testprogramm
Aufzug a = new Aufzug();
a.einsteigen(4);
a.einsteigen(3);
a.fahreZu(12);
a.personen = a.personen - 9;
a.maxPersonen = 20;
System.out.println(a.stockwerk + " " + a.personen + " " + a.maxPersonen);
Ausgabe: 12 -2 20
  1. Analysiere Material 1 und 2: Welche ungültigen Zustände entstehen, und welche Eigenschaften der Klasse machen sie möglich?
  2. Entwirf eine Klassenkarte für einen gekapselten Aufzug. Neben einsteigen soll es aussteigen geben. Begründe für jedes Attribut, welchen Zugriff es von außen bekommt.
  3. Implementiere deinen Entwurf in Java. einsteigen soll zurückgeben, ob das Einsteigen geklappt hat.
  4. Diskutiere die Frage, ob einsteigen(9) kappen oder abweisen sollte.

Hinweise

Hinweis zu Aufgabe a)
Verfolge die drei Attribute Zeile für Zeile und vergleiche mit den Regeln aus dem Text. Frage dich bei jeder falschen Zeile: fehlende Prüfung oder direkter Zugriff?„Analysieren“ heißt: gezielt herausarbeiten, wo und wodurch der Fehler entsteht.
Hinweis zu Aufgabe b)
Darf sich die Höchstzahl überhaupt ändern? Soll man die Personenzahl beliebig setzen können – oder nur durch Ein- und Aussteigen verändern?
Hinweis zu Aufgabe c)
Beim Einsteigen: Nur positive Anzahlen, und die Summe darf 6 nicht überschreiten. Beim Aussteigen können nicht mehr Personen aussteigen, als drin sind.
Hinweis zu Aufgabe d)
Kriterien: Was passiert in Wirklichkeit mit den drei Personen, die nicht mehr hineinpassen? Weiß das aufrufende Programm davon? Wie findet man Fehler beim Testen?

Erwartungshorizont

Erwartungshorizont zu Aufgabe a)

Ablauf: personen 4 → 7, stockwerk 12, personen −2, maxPersonen 20.

Ungültige Zustände: 7 Personen bei höchstens 6; Stockwerk 12, das es nicht gibt; −2 Personen; eine Höchstzahl von 20, die der echte Aufzug nicht hat.

Ursachen: einsteigen und fahreZu prüfen ihre Parameter nicht. Alle Attribute sind public und können von jedem Programmteil ohne Prüfung überschrieben werden (Zeilen 5 und 6). Die Klasse kann ihren Zustand deshalb nicht schützen.

Erwartungshorizont zu Aufgabe b)
Aufzug
  • - stockwerk: Ganzzahl
  • - personen: Ganzzahl
  • - maxPersonen: Ganzzahl
  • c Aufzug()
  • + getStockwerk(): Ganzzahl
  • + getPersonen(): Ganzzahl
  • + getMaxPersonen(): Ganzzahl
  • + fahreZu(ziel: Ganzzahl)
  • + einsteigen(anzahl: Ganzzahl): Wahrheitswert
  • + aussteigen(anzahl: Ganzzahl)

stockwerk: Getter; geändert nur über fahreZu mit Prüfung 0 bis 8 (wirkt wie ein prüfender Setter). personen: Getter, kein Setter – verändert nur über einsteigen/aussteigen. maxPersonen: nur Getter, der Wert ist technisch fest. Ein zusätzliches final ist gut, aber nicht verlangt.

Erwartungshorizont zu Aufgabe c)
public class Aufzug {
    private int stockwerk;
    private int personen;
    private int maxPersonen;

    public Aufzug() {
        stockwerk = 0;
        personen = 0;
        maxPersonen = 6;
    }

    public int getStockwerk() {
        return stockwerk;
    }

    public int getPersonen() {
        return personen;
    }

    public int getMaxPersonen() {
        return maxPersonen;
    }

    public void fahreZu(int ziel) {
        if (ziel >= 0 && ziel <= 8) {
            stockwerk = ziel;
        }
    }

    public boolean einsteigen(int anzahl) {
        if (anzahl > 0 && personen + anzahl <= maxPersonen) {
            personen = personen + anzahl;
            return true;
        }
        return false;
    }

    public void aussteigen(int anzahl) {
        if (anzahl > 0 && anzahl <= personen) {
            personen = personen - anzahl;
        }
    }
}

Mit dieser Klasse übersetzt javac die Zeilen 5 und 6 aus Material 2 nicht mehr (has private access); die Ausgabe in Zeile 7 muss nun die Getter benutzen. einsteigen(3) liefert nach 4 Personen false, fahreZu(12) bleibt wirkungslos.

Erwartungshorizont zu Aufgabe d)

Für Kappen: Der Aufzug fährt trotzdem mit so vielen Personen wie möglich los; der Zustand bleibt gültig.

Für Abweisen: In Wirklichkeit steigen bei 9 Personen nicht einfach 6 ein – die Gruppe muss sich aufteilen. Beim Kappen „verschwinden“ 3 Personen still, und das aufrufende Programm merkt es nicht; Fehler im Programm fallen so später auf. Beim Abweisen bleibt der alte Zustand erhalten, und der Rückgabewert false meldet klar, dass es nicht geklappt hat.

Ergebnis: Abweisen ist hier besser, weil es ehrlich ist und nichts Unbemerktes verändert. Eine begründete Entscheidung für eine Variante, die beide Seiten abwägt, ist vollständig.