Menu
Coddy logo textTech

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 par son nom : il n’y a aucun constructeur à appeler :

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

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

À l’intérieur de main :

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

Sortie :

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éé la première fois qu’il est utilisé, 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, car personne ne le crée. Ses propriétés obtiennent leurs valeurs dans leurs déclarations ou dans init. À part cela, il s’agit d’un corps de classe normal : état privé, fonctions d’aide 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')
}

Dans main :

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

Sortie :

user-001
order-002

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

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

Défi

Facile

Complétez 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 lorsque 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 commande top, puis affiche finalement players: avec le nombre de joueurs.

Votre code doit se trouver dans Leaderboard.kt et Functions.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()
    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