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
40Un 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
18Dans 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 changesDéfi
FacileComplé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)
}
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
1Classes et objets
Travailler avec des fichiersDéfinir des classesConstructeurs primairesBlocs init et validationConstructeurs secondairesRécapitulatif - Carte de bibliothèque4Héritage
Classes ouvertes et sous-classesRedéfinition des membressuper et constructeursClasses abstraitesRécapitulatif – Annuaire du personnel2Propriétés et encapsulation
Accesseurs personnalisésModificateurs de visibilitéSetters privéslazy et lateinitRécapitulatif - Compte bancaire5Interfaces
Déclarer des interfacesMéthodes par défautInterfaces multiplesInterfaces en tant que typesRécapitulatif - Méthodes de paiement8Génériques
Fonctions génériquesClasses génériquesContraintes de typeVariance avec in et outRécapitulatif - File de priorité11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Playground Kotlin