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: 50Kotlin 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
falseLes 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
}
}Défi
FacileComplé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]))
}
}
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