Menu
Coddy logo textTech

Objektdeklarationen

Teil des Abschnitts Objektorientierte Programmierung der Kotlin-Journey von Coddy. Lektion 12 von 57.

object Name { ... } deklariert eine Klasse und ihre einzige Instanz in einem Schritt. Du verwendest das Objekt über seinen Namen; es gibt keinen Konstruktor, den du aufrufen musst:

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

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

Innerhalb von main:

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

Ausgabe:

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

Es gibt genau eine Instanz, daher liest und ändert jeder Teil des Programms, der das Objekt verwendet, denselben Zustand. Das Objekt wird beim ersten Zugriff erstellt, wie der folgende init-Block zeigt:

object Visits {
    var count = 0
        private set

    init { println("Visits created") }

    fun record() { count++ }
}

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

Innerhalb von main:

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

Ausgabe:

start
Visits created
3

Ein Objekt hat keinen Konstruktor, weil niemand es erstellt. Seine Eigenschaften erhalten ihre Werte in ihren Deklarationen oder in init. Abgesehen davon handelt es sich um einen normalen Klassenkörper: privater Zustand, private Hilfsfunktionen und öffentliche Methoden:

object IdGenerator {
    private var next = 1

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

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

Innerhalb von main:

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

Ausgabe:

user-001
order-002

Verwende ein Objekt für etwas, von dem es in einem Programm genau eines gibt: eine Registrierung, die Konfiguration oder eine Gruppe von Hilfsfunktionen. Ein Objekt ist ein globaler Zustand, den jede Datei ändern kann. Halte daher seine Setter privat und lasse seine Methoden jede Änderung überprüfen.

object Units {
    fun kmToMiles(km: Double) = km * 0.621371
}
Units.kmToMiles(10.0)        // über den Namen aufgerufen
// val u = Units()           // Fehler: ein Objekt hat keinen Konstruktor
challenge icon

Aufgabe

Einfach

Vervollständige das Objekt Leaderboard. Es speichert die Punkte jedes Spielers in einer privaten Map. add(player, points) fügt Punkte hinzu, top() gibt den Spitzenreiter als ada 6 zurück (bei gleicher Punktzahl der Name, der alphabetisch zuerst kommt) oder empty, wenn niemand Punkte hat, reset() entfernt alle, und die Eigenschaft players ist die Anzahl der Spieler.

Die Hilfsfunktionen recordWin und recordDraw in Functions.kt werden bereitgestellt: Sie verwenden Leaderboard aus einer anderen Datei. Der bereitgestellte Code liest die Befehle win ada, draw ada bo, top oder reset, gibt für jedes top top() aus und schließlich players: mit der Anzahl aus.

Dein Code gehört in Leaderboard.kt und Functions.kt. Main.kt enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.

Probier es selbst

fun main() {
    // Bereitgestellter Ein-/Ausgabe-Code: belasse ihn wie er ist
    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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Kotlin-Playground