Menu
Coddy logo textTech

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 :

1

Cela 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'add

Un 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" }
}
challenge icon

Défi

Facile

Complé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é.

REQUIRED OUTPUT FORMAT: [Your translated content here]

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}")
}
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