Setters privés
Fait partie de la section Programmation orientée objet du Journey Kotlin de Coddy. Leçon 9 sur 57.
Souvent, le code externe devrait pouvoir lire une propriété, mais pas la modifier. private set conserve l’accesseur de lecture public et rend seul l’accesseur d’écriture privé :
class Counter {
var count = 0
private set
fun increment() {
count++
}
}À l’intérieur de main :
val c = Counter()
c.increment()
println(c.count)
// c.count = 99 // erreur : le setter est privéSortie :
1Cela convient aux valeurs qui ne peuvent changer qu’au moyen d’une règle, comme un score qui n’augmente qu’avec des récompenses valides :
class Player(val name: String) {
var score = 0
private set
private val _history = mutableListOf<Int>()
val history: List<Int> get() = _history
fun award(points: Int) {
if (points <= 0) return
score += points
_history.add(points)
}
}À l’intérieur de main :
val p = Player("Ada")
p.award(10)
p.award(-5)
p.award(3)
println(p.score)
println(p.history)Sortie :
13
[10, 3]La history ci-dessus montre un schéma courant : une MutableList privée à l’intérieur de la classe, exposée sous forme de List en lecture seule. Les appelants peuvent lire les éléments, mais ne disposent ni de add ni de remove pour les modifier :
private val _items = mutableListOf<String>()
val items: List<String> get() = _items // vue en lecture seule
// à l'extérieur : items.add("x") // erreur : List n'a pas d'addUn val ne change jamais après sa création, pas même à l’intérieur de la classe. Un var avec private set reste modifiable uniquement à l’intérieur de la classe. Choisis val pour les valeurs qui restent fixes pendant toute la durée de vie de l’objet :
class Order(val id: Int) { // ne change jamais
var status = "new"
private set // change, mais seulement à l'intérieur de Order
fun ship() { status = "shipped" }
}Défi
FacileComplétez la classe Elevator(val topFloor: Int). floor et trips peuvent être lus depuis l’extérieur, mais ne peuvent être modifiés qu’à l’intérieur de la classe (private set). goTo(target) se déplace entre l’étage 0 et topFloor : un déplacement valide vers un étage différent met à jour floor, ajoute 1 à trips et renvoie true ; un déplacement non valide ou vers le même étage renvoie false.
Le code fourni lit l’étage supérieur, puis les étages cibles. Il affiche floor 3 après un déplacement ou stay 3 lorsque le déplacement a été refusé, puis affiche finalement trips: avec le nombre de déplacements.
Votre code doit être placé dans Elevator.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()
val lift = Elevator(input[0].toInt())
for (line in input.drop(1)) {
val moved = lift.goTo(line.toInt())
println("${if (moved) "floor" else "stay"} ${lift.floor}")
}
println("trips: ${lift.trips}")
}
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