Menu
Coddy logo textTech

Accesseurs personnalisés

Fait partie de la section Programmation orientée objet du Journey Kotlin de Coddy. Leçon 7 sur 57.

Chaque propriété Kotlin possède un getter, et chaque var possède également un setter. Par défaut, ils lisent et écrivent une valeur stockée. Un getter personnalisé calcule plutôt la valeur à chaque lecture :

class Rectangle(var width: Int, var height: Int) {
    val area: Int
        get() = width * height
}

Dans main :

val r = Rectangle(3, 4)
println(r.area)
r.width = 10
println(r.area)

Sortie :

12
40

Un setter personnalisé exécute du code chaque fois que la propriété reçoit une valeur. À l’intérieur, value est la valeur attribuée et field est la valeur stockée derrière la propriété, le champ de stockage :

class Thermostat {
    var target = 20
        set(value) {
            field = value.coerceIn(10, 30)
        }
}

À l’intérieur de main :

val t = Thermostat()
t.target = 42
println(t.target)
t.target = 18
println(t.target)

Sortie :

30
18

Dans un accesseur, utilisez field, et non le nom de la propriété : écrire target = value à l’intérieur du setter de target rappellerait le setter, indéfiniment :

var target = 20
    set(value) {
        // target = value        // appelle ce setter à nouveau : récursion infinie
        field = value             // stocke la valeur
    }

Un setter est également l’endroit où réagir aux changements, par exemple pour les compter ou les journaliser :

class Player(name: String) {
    var changes = 0
        private set
    var name = name
        set(value) {
            field = value.trim()
            changes++
        }
}

Dans main :

val p = Player("ada")
p.name = "  Ada  "
p.name = "Ada L."
println("${p.name} after ${p.changes} changes")

Sortie :

Ada L. after 2 changes
challenge icon

Défi

Facile

Complétez la classe Circle(radius: Double). radius est un var dont le setter stocke les valeurs négatives sous forme de 0. Ajoutez les propriétés en lecture seule diameter et area (π r² avec Math.PI) avec des getters personnalisés, ainsi que label, qui renvoie r=2.0 d=4.0 a=12.57, l’aire étant arrondie à deux décimales ("%.2f".format(area)).

Le code fourni lit un rayon par ligne, affiche label, puis double le rayon du dernier cercle et affiche à nouveau label ; les valeurs doivent donc suivre le rayon.

Votre code doit être placé dans Circle.kt. Main.kt contient le code fourni pour les entrées et les sorties et ne peut pas être modifié.

Essayez vous-même

fun main() {
    // Code d'entrée/sortie fourni : le garder tel quel
    val input = generateSequence(::readLine).toList()
    var last = Circle(0.0)
    for (line in input) {
        last = Circle(line.toDouble())
        println(last.label)
    }
    last.radius *= 2
    println(last.label)
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Playground Kotlin