Clases de datos
Parte de la sección Programación orientada a objetos del Journey de Kotlin de Coddy. Lección 32 de 57.
Una clase de datos es una clase cuya función principal es contener datos. El modificador data hace que el compilador genere toString(), equals(), hashCode(), copy() y componentN() a partir de las propiedades del constructor principal:
data class Point(val x: Int, val y: Int)Dentro de main:
val a = Point(1, 2)
val b = Point(1, 2)
println(a)
println(a == b)
println(setOf(a, b).size)Salida:
Point(x=1, y=2)
true
1Sin data, println muestra el nombre de la clase y un código hash como Point@1b6d3586, y dos objetos con los mismos valores no son iguales. copy() crea un objeto nuevo con algunas propiedades modificadas y deja el original tal como está, por lo que una clase de datos con propiedades val funciona como un valor inmutable:
data class User(val name: String, val email: String, val admin: Boolean = false)Dentro de main:
val ada = User("Ada", "ada@example.com")
val boss = ada.copy(admin = true)
println(ada)
println(boss)
println(ada == boss)Salida:
User(name=Ada, email=ada@example.com, admin=false)
User(name=Ada, email=ada@example.com, admin=true)
falseLas declaraciones de desestructuración desempaquetan un objeto en variables: val (x, y) = point llama a los component1() y component2() generados, en el orden del constructor. También funciona en bucles for y en parámetros de lambdas, y _ omite una propiedad:
data class Score(val player: String, val points: Int, val level: Int)Dentro de main:
val scores = listOf(Score("ada", 120, 3), Score("bo", 95, 2))
for ((player, points) in scores) println("$player: $points")
val (_, bestPoints, bestLevel) = scores.maxBy { it.points }
println("best: $bestPoints at level $bestLevel")Salida:
ada: 120
bo: 95
best: 120 at level 3Solo participan las propiedades del constructor primario: una propiedad declarada en el cuerpo de la clase se omite de toString, equals, hashCode y copy. Una clase de datos necesita al menos un parámetro de constructor, y cada parámetro debe ser un val o var:
data class Reading(val sensor: String, val value: Int) {
var note = ""
}Dentro de main:
val r1 = Reading("t1", 20)
val r2 = Reading("t1", 20)
r1.note = "checked"
println(r1)
println(r1 == r2)Salida:
Reading(sensor=t1, value=20)
trueDesafío
FácilHaz que Book sea una clase de datos para que se imprima y se compare por valor. Después, completa tres funciones: parse(line) convierte Dune;Herbert;1965 en un Book, newEdition(book, year) devuelve una copia con el año nuevo y (new edition) añadido al título, y describe(book) devuelve Dune by Herbert, 1965 mediante una declaración de desestructuración.
El código proporcionado analiza cada línea de entrada, imprime cada libro, el número de duplicados, la nueva edición del primer libro (año 2024) y una descripción de cada libro distinto.
Tu código debe ir en Book.kt y BookTools.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: mantenlo tal como está
val input = generateSequence(::readLine).toList()
val books = input.map { parse(it) }
for (b in books) println(b)
println("duplicates: ${books.size - books.distinct().size}")
println(newEdition(books[0], 2024))
for (b in books.distinct()) println(describe(b))
}
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
1Clases y objetos
Trabajar con archivosDefinir clasesConstructores primariosBloques init y validaciónConstructores secundariosRepaso - Tarjeta de biblioteca4Herencia
Clases abiertas y subclasesSobrescritura de miembrossuper y constructoresClases abstractasRepaso: directorio del personal7Clases especiales
Clases de datosClases enumJerarquías selladasequals, hashCode, toStringRepaso - Rastreador de pedidos2Propiedades y encapsulación
Accesores personalizadosModificadores de visibilidadSetters privadoslazy y lateinitRepaso: cuenta bancaria5Interfaces
Declaración de interfacesMétodos predeterminadosInterfaces múltiplesInterfaces como tiposRepaso: métodos de pago8Genéricos
Funciones genéricasClases genéricasRestricciones de tiposVariancia con in y outRepaso - Cola de prioridad11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Playground de Kotlin