s n h m r u

Minimallogo des digitalen Schulbuchs inf-schule.de. Schriftzug in Zustandsübergangsdiagramm eines endlichen Automaten.

s n h m r u
i

Getter

Lesenden Zugriff auf Attribute steuern

Beim schreibenden Zugriff auf Attribute wird automatisch der Setter aufgerufen. Analog dazu wird beim lesenden Zugriff automatisch ein sogenannter Getter aufgerufen. Dieser berechnet einen Wert, der dann zurückgegeben wird. Normalerweise gibt ein Getter einfach den Wert eines Attributs zurück, aber theoretisch könnte er auch eine Berechnung durchführen, bevor er einen Wert zurückgibt.

Auch ein Getter erinnert an eine Methode, hat aber in Kotlin eine spezielle Syntax, die ihn von einer normalen Methode unterscheidet:

class FakeTimer {
    var min: Int = 0
        get() {
            return field + 1
        }
}

Aufgabe 1

Beschreibe den Aufbau und die Funktionsweise eines Getters in Kotlin. Experimentiere dazu mit dem folgenden Code:

class FakeTimer {
    var min: Int = 0
        get() {
            return field + 1
        }
}

fun main() {
    val timer = FakeTimer()
    timer.min = 5
    println(timer.min)
    timer.min = 8
    println(timer.min)
}

Berechnete Eigenschaften

In der Praxis nutzt man Getter normalerweise natürlich nicht, um die Werte von Attributen zu verfälschen. Man nutzt sie vielmehr, um Eigenschaften zu berechnen, die von anderen Attributen abhängen. Man nennt solche Eigenschaften auch computed properties. Im Fall unseres Timers könnte man z.B. eine computed property zeitspanne definieren, welche die Zeitspanne zwischen der minimalen und maximalen Zeit berechnet und zurückgibt. Für die berechnete Eigenschaft zeitspanne sieht das konkret so aus:

class Timer {
    var min: Int = 0
    var max: Int = 0

    val zeitspanne: Int
        get() {
            return max - min
        }
}

Aufgabe 2

(a) Betrachte die Implementierung der berechneten Eigenschaft zeitspanne und beschreibe die Unterschiede zu einem normalen Attribut.

(b) Ergänze die Klasse Timer um die berechnete Eigenschaft zeitspanne. Teste deine Implementierung, indem du ein Hauptprogramm schreibst, das einen Timer erzeugt, die minimalen und maximalen Zeiten setzt und die Zeitspanne ausgibt. Nutze dazu das BlueJ-Projekt oder die Online-Version unten.

class Timer {
    var min: Int = 0
    var max: Int = 0
}

fun main() {
    val timer = Timer()
    // Hier solltest du den Timer noch testen
}

Methode oder Eigenschaft?

Berechnete Eigenschaften könnte man eigentlich genauso gut mit Methoden implementieren, z.B. mit einer Methode berechneZeitspanne(): Int, die die Zeitspanne berechnet und zurückgibt. In einigen Sprachen muss man das sogar so machen, da es dort keine berechneten Eigenschaften gibt. In Kotlin gibt es berechneten Eigenschaften, wodurch man besser zwischen Eigenschaften, also den Werten eines Objekts, und Methoden, also den Fähigkeiten eines Objekts, unterscheiden kann. Dass eine Eigenschaft berechnet wird und nicht als normales Attribut gespeichert wird, kann man auch im Klassendiagramm darstellen:

Timer mit berechneter Eigenschaft

Wir verwenden im Folgenden eher berechnete Eigenschaften als Methoden, also computed properties. Es ist aber auch legitim, Methoden zu verwenden, wenn man Eigenschaften eines Objekts hat, die von anderen Eigenschaften abhängen und sich daraus berechnen lassen.

Suche

v
100.123.3.1.3 Getter
Kopieren durch Anklicken

Rückmeldung geben