Menu
Coddy logo textTech

Declarações de Objetos

Parte da seção Programação Orientada a Objetos do Journey de Kotlin da Coddy. Lição 12 de 57.

object Name { ... } declara uma classe e sua única instância em uma única etapa. Você usa o objeto pelo nome; não há construtor a ser chamado:

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())

Saída:

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

Há exatamente uma instância, portanto cada parte do programa que usa o objeto lê e altera o mesmo estado. O objeto é criado na primeira vez que é usado, como mostra o bloco init abaixo:

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)

Saída:

start
Visits created
3

Um objeto não tem construtor, porque ninguém o cria. Suas propriedades obtêm seus valores em suas declarações ou em init. Fora isso, ele é um corpo de classe normal: estado privado, auxiliares privados e 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"))

Saída:

user-001
order-002

Use um objeto para algo do qual há exatamente uma única instância em um programa: um registro, a configuração ou um grupo de funções auxiliares. Um objeto é um estado global que qualquer arquivo pode alterar; portanto, mantenha seus setters privados e deixe que seus métodos verifiquem cada alteração.

object Units {
    fun kmToMiles(km: Double) = km * 0.621371
}
Units.kmToMiles(10.0)        // chamado através do nome
// val u = Units()           // erro: um objeto não tem construtor
challenge icon

Desafio

Fácil

Complete o objeto Leaderboard. Ele mantém os pontos de cada jogador em um mapa privado. add(player, points) adiciona pontos, top() retorna o líder como ada 6 (em caso de empate nos pontos, o nome que vem primeiro em ordem alfabética) ou empty quando ninguém tem pontos, reset() remove todos, e a propriedade players é o número de jogadores.

As funções auxiliares recordWin e recordDraw em Functions.kt são fornecidas: elas usam Leaderboard de outro arquivo. O código fornecido lê os comandos win ada, draw ada bo, top ou reset, imprime top() para cada top e, por fim, players: com a contagem.

Seu código deve ficar em Leaderboard.kt e Functions.kt. Main.kt contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

fun main() {
    // Código de entrada/saída fornecido: mantenha-o 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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Playground de Kotlin