Menu
CoddyTech

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 bei seiner ersten Verwendung 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 es niemand erstellt. Seine Eigenschaften erhalten ihre Werte in ihren Deklarationen oder in init. Abgesehen davon ist es ein normaler Klassenrumpf: 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 Registry, die Konfiguration oder eine Gruppe von Hilfsfunktionen. Ein Objekt ist ein globaler Zustand, den jede Datei ändern kann. Halte seine Setter daher privat und lass seine Methoden jede Änderung prü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 den Namen, der alphabetisch zuerst kommt) oder empty, wenn niemand Punkte hat, reset() entfernt alle Spieler, und die Eigenschaft players gibt die Anzahl der Spieler an.

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 den Wert von top() aus und schließlich players: mit der Anzahl.

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

Probier es selbst

fun main() {
    // Vorgegebener Ein-/Ausgabecode: unverändert lassen
    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