Menu
Coddy logo textTech

Modificateurs de visibilité

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

Encapsulation signifie qu'une classe contrôle la manière dont ses données sont utilisées. Les modificateurs de visibilité déterminent qui peut voir un membre. private le cache à tout ce qui se trouve en dehors de la classe, de sorte que les propres méthodes de la classe sont le seul moyen d'y accéder :

class Account {
    private var balance = 0

    fun deposit(amount: Int) {
        if (amount > 0) balance += amount
    }

    fun report() = "balance: $balance"
}

Dans main :

val a = Account()
a.deposit(50)
a.deposit(-999)
println(a.report())
// a.balance = 1_000_000    // erreur : impossible d'accéder à 'balance' : il est privé

Sortie :

balance: 50

Kotlin possède quatre modificateurs. Sans l’un d’eux, une déclaration est public, visible partout :

public      // par défaut : visible partout
internal    // visible dans le même module (app ou bibliothèque)
protected   // visible dans la classe et ses sous-classes
private     // visible à l'intérieur de la classe (ou du fichier, pour les déclarations de premier niveau)

Les fonctions d’aide privées maintiennent la surface publique réduite. Les appelants voient ce que fait la classe, et non comment :

class Password(private val text: String) {
    val isStrong: Boolean
        get() = hasDigit() && text.length >= 8

    private fun hasDigit() = text.any { it.isDigit() }
}

À l’intérieur de main :

println(Password("secret123").isStrong)
println(Password("short1").isStrong)

Sortie :

true
false

Les propriétés des constructeurs acceptent elles aussi des modificateurs : private val stocke une valeur que le code extérieur ne peut pas lire. Masquer les données permet à une classe de vérifier chaque modification et de respecter ses règles :

class Locker(private val code: String) {
    private val items = mutableListOf<String>()
    fun store(item: String, code: String): Boolean {
        if (code != this.code) return false
        items.add(item)
        return true
    }
}
challenge icon

Défi

Facile

Complétez la classe Locker(private val code: String). Sa liste items est privée. store(item, code) ajoute l’élément uniquement lorsque le code correspond et renvoie si l’ajout a réussi ; open(code) renvoie les éléments joints avec , (ou empty) lorsque le code correspond, et wrong code dans le cas contraire.

Le code fourni lit le code du casier, puis les commandes put <code> <item> ou open <code>. Il affiche stored ou denied pour chaque commande put, ainsi que le résultat de chaque commande open.

Votre code doit être placé dans Locker.kt. Main.kt contient le code fourni pour les entrées et 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 locker = Locker(input[0])
    for (cmd in input.drop(1)) {
        val p = cmd.split(" ")
        if (p[0] == "put") println(if (locker.store(p[2], p[1])) "stored" else "denied")
        else println(locker.open(p[1]))
    }
}
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