Examinemos en este post qué es una Data Class en Kotlin.
¿Qué es una Data Class en Kotlin?
Kotlin incorpora el concepto de data class que no es más que una clase con el objetivo de almacenar temporalmente datos para transferirlos en servicios, funciones o realizar algún operación sobre estos.
Esto lo conocemos habitualmente como DTO (data transfer object).
¿Cómo se crea una data class en Kotlin?
Suponiendo que deseamos crear una data class para recibir algunos valores de una Persona a fin de realizar luego una búsqueda.
Queremos entonces crear una data class con dos variables para almacenar el nombre y el apellido
data class PersonDTO(var name: String, var surname: String) {
}
Si vienes de Java, notarás aquí algunas diferencias:
- No es necesario definir set / get para las variables
- No es necesario crear equal y el hashcode
- Crea un toString por default
Las data class además proveen de forma automática: - equals() - hashCode() - toString() para todos los atributos - la función componentN() para descomponer la clase - la función copy() para efectuar una copia del objeto
Crear un objeto desde una data class
Crear una instancia de la data class es igual que hacerlo con una clase.
Vamos a crear la instancia e imprimir el objeto creado.
var personDTO = PersonDTO("jhon", "smith");
println(personDTO)
Vemos que sin necesidad de haber sobreescrito el método toString ya tenemos un resultado visible.
Equal de una Data class
Dijimos que algo que nos provee las data class es el equal .
Entonces si tenemos dos instancias distintas pero con los mismos valores, la función equal que trae por defecto, nos dará la igualdad.
val personA = PersonDTO("jhon", "smith");
val personB = PersonDTO("jhon", "smith");
println(personA == personB) // true
Copy de una Data class
En general los DTO / data class deberían ser objetos inmutables cuyos valores no deberían poder cambiarse.
Si quisiéramos esto solo tenemos que definir nuestra data class con sus valores como val
Recordemos lo que vimos respecto a variables y valores en Kotlin. Un var es una variable y un val es un valor inmutable.
Entonces nuestra data class quedaría así.
data class PersonDTO(val name: String, val surname: String) {
}
Si quisiéramos modificar algún valor, no podríamos.
Sin embargo, si podemos realizar un copy del objeto. Esto crea un nuevo objeto que es copia del inicial con los nuevos valores que deseamos.
val personDTO = PersonDTO("jhon", "smith");
println(personDTO)
// personDTO.name = "jane" <-- error
// copy of personDTO
val personDTO1 = personDTO.copy(name = "jane")
println(personDTO1)
Vemos lo siguiente como resultado:
El componentN() de data class
Puede resultar útil ‘extraer’ los valores que contiene la data class.
Para ello tenemos dos formas.
La primera en la que creamos dos values name y age y le pedimos a Kotlin que extraiga los valores de la instancia personDTO1 en dichas variables.
val (name, age) = personDTO1
println(name)
println(age)
La segunda es usando componentN.
Kotlin crea para la instancia de nuestra data class funciones component para cada atributo, agregando
el numero correspondiente a la posición del atributo.
De este modo:
// componentN
println(personDTO1.component1()) // Prints "jane"
println(personDTO1.component2()) // Prints "smith"
Conclusión
Hemos visto cómo se crean Data Classes en Kotlin. Algunos usos sobre sus funciones y vimos como nos ahorra gran cantidad de líneas de código.