Menu
Coddy logo textTech

Expresiones de objetos

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

Una expresión de objeto crea un objeto puntual de una clase sin nombre, justo donde se necesita. Se escribe object : Type { ... } y normalmente implementa una interfaz. Una interfaz enumera métodos sin indicar cómo funcionan; el capítulo 5 aborda las interfaces en profundidad:

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

Salida:

Good morning, Ada.

Una declaración de objeto existe una sola vez. Una expresión de objeto se evalúa cada vez que se ejecuta su código, y cada ejecución crea un objeto nuevo. Puede leer y cambiar las variables locales que la rodean:

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

Salida:

10 11 1

Un uso común es proporcionar un comportamiento a una función de biblioteca. sortedWith recibe un Comparator, una interfaz cuyo método compare(a, b) devuelve un número negativo cuando a aparece primero, cero en caso de empate y un número positivo en cualquier otro caso:

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

Salida:

[fig, kiwi, apple, banana]

Una expresión de objeto sin supertipo agrupa algunos valores en un objeto local; sus propiedades pueden usarse dentro de la misma función. Cuando una interfaz tiene un solo método, una lambda suele ser más corta que una expresión de objeto. Las expresiones de objeto son adecuadas cuando hay varios métodos o algún estado que conservar.

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

Desafío

Fácil

La interfaz Validator tiene un método, check(text), que devuelve un mensaje de error o null cuando el texto es válido. Completa la función rules(minLength) para que devuelva tres validadores creados con expresiones de objeto, en este orden: el texto debe tener al menos minLength caracteres (too short), contener un dígito (needs a digit) y no contener espacios (no spaces allowed).

El código proporcionado lee la longitud mínima y después una contraseña por línea. Imprime ok o todos los mensajes de error de esa contraseña unidos con ; .

Tu código debe ir en Rules.kt y Validator.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()
    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 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