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 1Um 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 lambdaDesafio
FácilA 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("; "))
}
}
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
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesConstrutores PrimáriosBlocos init e ValidaçãoConstrutores SecundáriosRecapitulação - Cartão da Biblioteca4Herança
Classes Abertas e SubclassesSobrescrevendo Membrossuper e ConstrutoresClasses AbstratasRevisão - Diretório de Funcionários2Propriedades e Encapsulamento
Acessores PersonalizadosModificadores de VisibilidadeSetters Privadoslazy e lateinitRevisão - Conta Bancária5Interfaces
Declarando InterfacesMétodos PadrãoMúltiplas InterfacesInterfaces como TiposRecapitulação - Métodos de Pagamento8Genéricos
Funções genéricasClasses genéricasRestrições de tipoVariância com in e outRecapitulação - Fila de prioridade11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de Livros3Objetos e Companheiros
Declarações de ObjetosObjetos CompanionConstantes com constExpressões de ObjetosRevisão - BilheteriaPratique por conta própria: Playground de Kotlin