Menu
Coddy logo textTech

Dichiarazioni di oggetti

Fa parte della sezione Programmazione orientata agli oggetti del percorso Kotlin di Coddy. Lezione 12 di 57.

object Name { ... } dichiara una classe e la sua unica istanza in un solo passaggio. Usi l'oggetto tramite il suo nome; non c'è un costruttore da chiamare:

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

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

All'interno di main:

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

Output:

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

Esiste esattamente un'unica istanza, quindi ogni parte del programma che usa l'oggetto legge e modifica lo stesso stato. L'oggetto viene creato la prima volta che viene usato, come mostra il blocco init qui sotto:

object Visits {
    var count = 0
        private set

    init { println("Visits created") }

    fun record() { count++ }
}

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

All'interno di main:

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

Output:

start
Visits created
3

Un oggetto non ha un costruttore, perché nessuno lo crea. Le sue proprietà ricevono i valori nelle dichiarazioni o in init. A parte questo, è un normale corpo di classe: stato privato, funzioni di supporto private e metodi pubblici:

object IdGenerator {
    private var next = 1

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

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

All'interno di main:

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

Output:

user-001
order-002

Usa un oggetto per qualcosa di cui esiste esattamente un esemplare in un programma: un registro, la configurazione, un gruppo di funzioni di supporto. Un oggetto è uno stato globale che qualsiasi file può modificare, quindi mantieni privati i suoi metodi setter e lascia che siano i suoi metodi a controllare ogni modifica.

object Units {
    fun kmToMiles(km: Double) = km * 0.621371
}
Units.kmToMiles(10.0)        // chiamato tramite il nome
// val u = Units()           // errore: un oggetto non ha un costruttore
challenge icon

Sfida

Facile

Completa l'oggetto Leaderboard. Mantiene i punti di ogni giocatore in una mappa privata. add(player, points) aggiunge punti, top() restituisce il leader come ada 6 (a parità di punti, il nome che viene prima in ordine alfabetico) oppure empty quando nessuno ha punti, reset() rimuove tutti e la proprietà players indica il numero di giocatori.

Le funzioni helper recordWin e recordDraw in Functions.kt sono fornite: usano Leaderboard da un altro file. Il codice fornito legge i comandi win ada, draw ada bo, top o reset, stampa top() per ogni top e infine players: seguito dal conteggio.

Il tuo codice va inserito in Leaderboard.kt e Functions.kt. Main.kt contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

fun main() {
    // Codice di input/output fornito: lascialo così com'è
    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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Playground Kotlin