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:
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.