Menu
CoddyTech

Déclarations d’objets

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

object Name { ... } déclare une classe et son unique instance en une seule étape. Vous utilisez l’objet en l’appelant par son nom ; il n’y a pas de constructeur à appeler :

object AppConfig {
    var theme = "light"
    val version = "1.4"

    fun describe() = "v$version, $theme theme"
}

Dans main :

println(AppConfig.describe())
AppConfig.theme = "dark"
println(AppConfig.describe())

Résultat :

v1.4, light theme
v1.4, dark theme

Il existe exactement une instance, donc chaque partie du programme qui utilise l’objet lit et modifie le même état. L’objet est créé lors de sa première utilisation, comme le montre le bloc init ci-dessous :

object Visits {
    var count = 0
        private set

    init { println("Visits created") }

    fun record() { count++ }
}

fun home() = Visits.record()
fun about() { Visits.record(); Visits.record() }

À l’intérieur de main :

println("start")
home()
about()
println(Visits.count)

Sortie :

start
Visits created
3

Un objet n’a pas de constructeur, parce que personne ne le crée. Ses propriétés reçoivent leurs valeurs dans leurs déclarations ou dans init. À part cela, son corps est celui d’une classe normale : état privé, méthodes auxiliaires privées et méthodes publiques :

object IdGenerator {
    private var next = 1

    fun newId(prefix: String) = "$prefix-${pad(next++)}"

    private fun pad(n: Int) = n.toString().padStart(3, '0')
}

À l’intérieur de main :

println(IdGenerator.newId("user"))
println(IdGenerator.newId("order"))

Sortie :

user-001
order-002

Utilise un objet pour quelque chose dont il n’existe qu’un seul exemplaire dans un programme : un registre, la configuration, un groupe de fonctions utilitaires. Un objet est un état global que n’importe quel fichier peut modifier ; garde donc ses accesseurs privés et laisse ses méthodes vérifier chaque modification.

object Units {
    fun kmToMiles(km: Double) = km * 0.621371
}
Units.kmToMiles(10.0)        // appelé par son nom
// val u = Units()           // erreur : un objet n’a pas de constructeur
challenge icon

Défi

Facile

Complète l’objet Leaderboard. Il conserve les points de chaque joueur dans une map privée. add(player, points) ajoute des points, top() renvoie le leader sous la forme ada 6 (en cas d’égalité, le nom qui vient en premier dans l’ordre alphabétique) ou empty si personne n’a de points, reset() supprime tout le monde, et la propriété players correspond au nombre de joueurs.

Les fonctions auxiliaires recordWin et recordDraw dans Functions.kt sont fournies : elles utilisent Leaderboard depuis un autre fichier. Le code fourni lit les commandes win ada, draw ada bo, top ou reset, affiche top() pour chaque top et enfin players: suivi du nombre.

Ton code va dans Leaderboard.kt et Functions.kt. Main.kt contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

fun main() {
    // Code d'entrée/sortie fourni : conservez-le tel quel
    val input = generateSequence(::readLine).toList()
    for (cmd in input) {
        val p = cmd.split(" ")
        when (p[0]) {
            "win" -> recordWin(p[1])
            "draw" -> recordDraw(p[1], p[2])
            "reset" -> Leaderboard.reset()
            else -> println(Leaderboard.top())
        }
    }
    println("players: ${Leaderboard.players}")
}
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