Menu
CoddyTech

Declaraciones de objetos

Parte de la sección Programación orientada a objetos del Journey de Kotlin de Coddy. Lección 12 de 57.

object Name { ... } declara una clase y su única instancia en un solo paso. Usas el objeto por su nombre; no hay ningún constructor que llamar:

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

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

Dentro de main:

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

Salida:

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

Hay exactamente una instancia, así que cada parte del programa que usa el objeto lee y modifica el mismo estado. El objeto se crea la primera vez que se usa, como muestra el bloque init de abajo:

object Visits {
    var count = 0
        private set

    init { println("Visits created") }

    fun record() { count++ }
}

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

Dentro de main:

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

Salida:

start
Visits created
3

Un objeto no tiene constructor, porque nadie lo crea. Sus propiedades obtienen sus valores en sus declaraciones o en init. Aparte de eso, es un cuerpo de clase normal: estado privado, funciones auxiliares privadas y métodos públicos:

object IdGenerator {
    private var next = 1

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

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

Dentro de main:

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

Salida:

user-001
order-002

Usa un objeto para algo de lo que hay exactamente uno en un programa: un registro, la configuración o un grupo de funciones auxiliares. Un objeto es un estado global que cualquier archivo puede cambiar, así que mantén privados sus métodos de asignación y deja que sus métodos comprueben cada cambio.

object Units {
    fun kmToMiles(km: Double) = km * 0.621371
}
Units.kmToMiles(10.0)        // llamado mediante el nombre
// val u = Units()           // error: un objeto no tiene constructor
challenge icon

Desafío

Fácil

Completa el objeto Leaderboard. Guarda los puntos de cada jugador en un mapa privado. add(player, points) suma puntos, top() devuelve al líder como ada 6 (si hay empate, el nombre que aparece primero alfabéticamente) o empty cuando nadie tiene puntos, reset() elimina a todos y la propiedad players es el número de jugadores.

Se proporcionan las funciones auxiliares recordWin y recordDraw en Functions.kt: usan Leaderboard desde otro archivo. El código proporcionado lee los comandos win ada, draw ada bo, top o reset, imprime top() por cada top y, al final, players: con el recuento.

Tu código va en Leaderboard.kt y Functions.kt. Main.kt contiene el código de entrada/salida proporcionado y no se puede editar.

Pruébalo tú mismo

fun main() {
    // Código de entrada/salida proporcionado: mantenlo tal como está
    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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Playground de Kotlin