Kotlin como crear data class

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

Kotlin data Class

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.

Kotlin data Class

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.

Kotlin data Class

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:

Kotlin data Class

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:

Kotlin Class

    // 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.