Data Classes

Una data class es una clase que contiene solamente atributos que quedemos guardar, por ejemplo datos de un superhéroe. Con esto conseguimos por ejemplo no tener varias variables «nombre1», «nombre2» para almacenar todos los superhéroes con los que vamos a trabajar.

Generando nuestra Data Class

Vamos a crear un proyecto nuevo llamado «SuperHeroList» y dentro crearemos una nueva clase de kotlin (No una activity) llamada Superhero. Para ello vamos al directorio donde tenemos el MainActivity y haciendo clic derecho seleccionamos New Kotlin File/class. 

curso android en kotlin

Ahora nos saldrá un diálogo para añadir el nombre de la clase y justo debajo, en kind seleccionaremos class.

curso android en kotlin

Creando clase en kotlin.

Al darle a ok, nos habrá creado una clase llamada class Superhero. Para convertirla en Data class, solo debemos añadir data delante.

data class Superhero(
        var superhero:String,
        var publisher:String,
        var realName:String,
        var photo:String
)

A simple vista podemos ver varias cosas, la primera que a diferencia de una clase normal esta no lleva llaves y la clase va precedida por «data». Esto le dice a Kotlin que esta clase va a tener por defecto una serie de funciones (aunque no vamos a tener que generarlas nosotros, lo hará el propio lenguaje por detrás) que podremos usar para rellenar dichos campos.  La idea es tener un objeto Superhero por cada superhéroe que tengamos. Un objeto es simplemente la instancia de una clase.

Creando objetos Superhero

Aunque la clase parezca muy sencilla, por detrás nos ha generado funciones para poder recuperar el valor de cada uno de los atributos, sustituirlos, compararlos…

Lo primero que haremos será crear nuestro primer objeto. Para generarlo usaremos el constructor por defecto que trae la clase. Un constructor es una función que se llama automáticamente cuando instanciamos el objeto, y su única función es asignar un valor a cada uno de los parámetros.

val batman:Superhero = Superhero("Batman", "DC", "Bruce Wayne", "https://cursokotlin.com/wp-content/uploads/2017/07/batman.jpg")

Hemos creado un objeto de la clase Superhero llamado batman. Para instanciarlo, tenemos que pasar entre paréntesis cada uno de los valores para cada atributo.

Trabajando con Batman

Ahora que tenemos el objeto batman, podemos acceder a cualquiera de sus atributos para recuperar el valor o cambiarlo.

val batman:Superhero = Superhero("Batman", "DC", "Bruce Wayne", "https://cursokotlin.com/wp-content/uploads/2017/07/batman.jpg")
val batmanRealName = batman.realName //Recuperamos "Bruce Wayne"
batman.realName = "Soy Batman" //Cambiamos "Brece Wayne" por "Soy Batman"
batman.toString() //Devolverá todos los atributos con su valor

Objetos inmutables

Supongamos que no queremos que esos objetos puedan ser cambiados, es información verídica que no requiere de cambio alguno. Para ello debemos ir a la data class y cambiar var por val.

data class Superhero(
        val superhero:String,
        val publisher:String,
        val realName:String,
        var photo:String
)

Ahora una vez creemos el objeto solo se podrá cambiar la foto. Si pasáramos todos los campos a val tendríamos un objeto inmutable por lo que no podríamos usar por ejemplo el batman.realName = «Nuevo nombre».

Si quisiéramos modificar a batman podríamos usar la función Copy() para crear un nuevo objeto con algún atributo distinto.

val batman:Superhero = Superhero("Batman", "DC", "Bruce Wayne", "https://cursokotlin.com/wp-content/uploads/2017/07/batman.jpg")
val superBatman:Superhero = batman.copy(superhero = "SuperBatman")

Ahora si hacemos un toString() veremos que todos los campos son iguales excepto el atributo superhero.

Recuperación de parámetros

Por defecto, en cada data class, kotlin nos genera un componentN() para cada uno de los parámetros.

batman.component1() //Batman
batman.component2() //DC
batman.component3() //Bruce Wayne
batman.component4() //https://cursokotlin.com/wp-content/uploads/2017/07/batman.jpg

También podemos almacenar todos los parámetros de un objeto de golpe.

val (superheroFav, publisherFav, realNameFav, photoFav) = batman
       superheroFav //Batman
       publisherFav //DC
       realNameFav //Bruce Wayne
       photoFav //https://cursokotlin.com/wp-content/uploads/2017/07/batman.jpg

Lista de superhéroes

Para acabar vamos a generar una lista de superheroes, que la usaremos en el siguiente capítulo para nuestra primera lista.

var superheros:MutableList<Superhero> = mutableListOf()
       superheros.add(Superhero("Spiderman", "Marvel", "Peter Parker", "https://cursokotlin.com/wp-content/uploads/2017/07/spiderman.jpg"))
       superheros.add(Superhero("Daredevil", "Marvel", "Matthew Michael Murdock", "https://cursokotlin.com/wp-content/uploads/2017/07/daredevil.jpg"))
       superheros.add(Superhero("Wolverine", "Marvel", "James Howlett", "https://cursokotlin.com/wp-content/uploads/2017/07/logan.jpeg"))
       superheros.add(Superhero("Batman", "DC", "Bruce Wayne", "https://cursokotlin.com/wp-content/uploads/2017/07/batman.jpg"))
       superheros.add(Superhero("Thor", "Marvel", "Thor Odinson", "https://cursokotlin.com/wp-content/uploads/2017/07/thor.jpg"))
       superheros.add(Superhero("Flash", "DC", "Jay Garrick", "https://cursokotlin.com/wp-content/uploads/2017/07/flash.png"))
       superheros.add(Superhero("Green Lantern", "DC", "Alan Scott", "https://cursokotlin.com/wp-content/uploads/2017/07/green-lantern.jpg"))
       superheros.add(Superhero("Wonder Woman", "DC", "Princess Diana", "https://cursokotlin.com/wp-content/uploads/2017/07/wonder_woman.jpg"))

Con esto tenemos una lista de superhéroes, en la que podríamos filtrar por ejemplo por compañía o ir añadiendo más en el futuro.