Menu
Coddy logo textTech

Expressões de Objetos

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

Uma expressão de objeto cria um objeto único de uma classe sem nome, exatamente onde ele é necessário. Ela é escrita como object : Type { ... } e geralmente implementa uma interface. Uma interface lista métodos sem dizer como eles funcionam; o capítulo 5 aborda as interfaces em profundidade:

interface Greeter {
    fun greet(name: String): String
}

Dentro de main:

val polite = object : Greeter {
    override fun greet(name: String) = "Good morning, $name."
}
println(polite.greet("Ada"))

Saída:

Good morning, Ada.

Uma declaração de objeto existe uma única vez. Uma expressão de objeto é avaliada sempre que seu código é executado, e cada execução cria um novo objeto. Ela pode ler e alterar as variáveis locais ao seu redor:

interface Counter {
    fun next(): Int
}

fun counterFrom(start: Int): Counter {
    var current = start
    return object : Counter {
        override fun next() = current++
    }
}

Dentro de main:

val a = counterFrom(10)
val b = counterFrom(1)
println("${a.next()} ${a.next()} ${b.next()}")

Saída:

10 11 1

Um uso comum é passar um comportamento para uma função de biblioteca. sortedWith recebe um Comparator, uma interface cujo método compare(a, b) retorna um número negativo quando a vem primeiro, zero em caso de empate e um número positivo caso contrário:

Dentro de main:

val words = listOf("kiwi", "fig", "banana", "apple")
val byLength = object : Comparator<String> {
    override fun compare(a: String, b: String) = a.length - b.length
}
println(words.sortedWith(byLength))

Saída:

[fig, kiwi, apple, banana]

Uma expressão de objeto sem um supertipo agrupa alguns valores em um objeto local; suas propriedades podem ser usadas dentro da mesma função. Quando uma interface tem um único método, uma lambda costuma ser mais curta do que uma expressão de objeto. Expressões de objeto são adequadas quando há vários métodos ou algum estado a ser mantido.

val size = object {
    val width = 3
    val height = 4
}
println(size.width * size.height)                    // 12

val byLength = Comparator<String> { a, b -> a.length - b.length }   // forma lambda
challenge icon

Desafio

Fácil

A interface Validator tem um método, check(text), que retorna uma mensagem de erro ou null quando o texto é aprovado. Complete a função rules(minLength) para que ela retorne três validadores criados com expressões de objeto, nesta ordem: o texto deve ter pelo menos minLength caracteres (too short), conter um dígito (needs a digit) e não conter espaços (no spaces allowed).

O código fornecido lê o comprimento mínimo e, em seguida, uma senha por linha. Ele imprime ok ou todas as mensagens de erro dessa senha unidas por ; .

Seu código deve ficar em Rules.kt e Validator.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()
    val checks = rules(input[0].toInt())
    for (password in input.drop(1)) {
        val problems = checks.mapNotNull { it.check(password) }
        println(if (problems.isEmpty()) "ok" else problems.joinToString("; "))
    }
}
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