Menu
Coddy logo textTech

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 mediante 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

Solo hay una instancia, por lo que cada parte del programa que utiliza el objeto lee y cambia el mismo estado. El objeto se crea la primera vez que se utiliza, 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 existe exactamente una instancia en un programa: un registro, la configuración o un grupo de funciones auxiliares. Un objeto es un estado global que cualquier archivo puede modificar, 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 a través del nombre
// val u = Units()           // error: un objeto no tiene constructor
challenge icon

Desafío

Fácil

Completa el objeto Leaderboard. Mantiene los puntos de cada jugador en un mapa privado. add(player, points) añade puntos, top() devuelve al líder como ada 6 (si los puntos son iguales, 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.

Las funciones auxiliares recordWin y recordDraw de Functions.kt se proporcionan: utilizan Leaderboard desde otro archivo. El código proporcionado lee los comandos win ada, draw ada bo, top o reset, imprime top() para cada top y finalmente players: con el recuento.

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

Pruébalo tú mismo

fun main() {
    // Código de entrada/salida suministrado: déjalo 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