En este segundo capítulo vamos a ver cómo funcionan las variables en Kotlin, qué es eso de val y de var, y cuál es más recomendable utilizar.
He querido empezar por aquí, porque te va a ser útil para entender después cómo crear «campos» en nuestras clases (ya veremos que no se llaman así).
Si quieres aprender todo sobre Kotlin y su situación actual en el sector del desarrollo Android, te animo a que te apuntes a mi masterclass gratuita donde te daré la hoja de ruta para aprender el lenguaje y sacarle el máximo partido.
Variables en Kotlin
Las variables en Kotlin nos permiten, al igual que en Java, asignar valores que luego pueden ser modificados y utilizados en distintos puntos de nuestro programa, siempre y cuando estén dentro del ámbito en el que se ejecuta dicho código.
Pero me voy a centrar en las diferencias que encontramos con Java.
1. Las variables pueden ser mutables e inmutables
Esto también se puede hacer en Java (marcándola como final si queremos que no se pueda modificar), pero en Kotlin es mucho menos verboso y cobran una nueva importancia: en Kotlin se prefieren los valores inmutables siempre que sea posible.
El que la mayor parte de nuestro programa sea inmutable genera muchos benificios, algunos de los cuales puedes ver en este artículo que escribí en GenbetaDev al respecto.
2. Se declaran indicando val o var según sean inmutables o mutables
Algo muy interesante de Kotlin es que en muchos puntos no hay que especificar el tipo de datos con el que estamos trabajando, siempre que el compilador lo pueda inferir.
Así que sólo tenemos que indicarle var o val en función del tipo de variable que queramos generar, y el tipo podrá normalmente inferirse del lado derecho. Aún así, podemos especificarle un tipo de forma explícita.
Algunos ejemplos:
var x = 7 var y: String = "my String" var z = View(this)
Spoiler: como ves, no hace falta utilizar new para crear una nueva instancia de un objeto.
3. Se hace casting automático de tipos
Siempre que el compilador sea capaz de de detectar que no hay otra opción posible, el casting se hará automáticamente. ¡Una maravilla!
val z: View = findViewById(R.id.my_view) if (z is TextView) { z.text = "I've been casted!" }
Curiosidad: ¿has visto que no he llamado a
setText()
? ¡La resolveré en los próximos artículos!
4. En Kotlin todo es un objeto
No existen los tipos básicos, y no existe void
. Si algo no devuelve nada, en realidad devuelve el objeto Unit
. La mayoría de las veces se puede omitir, pero está ahí, acechando.
Por tanto, todo esto son objetos:
val x: Int = 20 val y: Double = 21.5 val z: Unit = Unit
5. Los tipos numéricos más simples no se pueden asignar a otros más complejos
Por ejemplo, un entero no puede ser asignado a una variable de un long. Esto no compila:
val x: Int = 20 val y: Long = x
Necesita hacerse un casting explícito:
val x: Int = 20 val y: Long = x.toLong()
Conclusión
Estas son algunas de las diferencias más destacadas que puedes encontrar entre las variables en Java y en Kotlin. En general, las variables en Kotlin aportan mucha más flexibilidad, seguridad (debido a la convención de usar val siempre que se pueda) y un código más limpio y conciso.
Si todo esto te apasiona tanto como a mí, te animo a que te apuntes a mi training gratuito donde te contaré todo lo que necesitas para aprender a crear tus Apps Android en Kotlin desde cero.
Muy buena explicación, sobre las variables y la inmutabilidad.
Genial, muy buena explicación Kotlin esta super interesante ademas de las ventajas que tiene
Muchas gracias! Me alegro de que te haya resultado interesante.
Muy buen articulo. Tengo muchos deseos de comenzar ya con Kotlin.
Me gustaria saber otras ventajas de Kotlin, digase por ejemplo la parte visual, si es que Kotlin puede influir? ya que cuando programo en java(Android) me resulta muy tedioso esta parte, ademas que a veces hasta es mas lento de lo normal.
Muchas gracias de antemanos.
Para la parte de UI puedes echar un vistazo a esto: https://devexperto.com/kotlin-android-extensions/
Kotlin facilita la tarea en muchos sentidos, sí.
Hola Antonio,
que Kotlin use el concepto “inmutable” en las variables locales me chirría un poco. Me explico con un ejemplo:
class Cosa(var valor : Int)
fun main(args: Array) {
val cosa = Cosa(1)
cosa.valor = 2
}
Estamos modificando los valores de un objeto supuestamente inmutable. Lo que no podemos hacer es reasignar el valor de “cosa”. Creo que es un poco confuso.
Me parece mucho más preciso, por ejemplo, el uso que se le da al término en listOf y mutableListOf.
¿qué opinas?
Bueno, hablar de inmutabilidad en un lenguaje que acepta mutabilidad siempre es complejo, porque hay excepciones raras. Una variable puede ser inmutable pero almacenar un objeto mutable como en el caso que indicas. Por ejemplo las properties que usan val no siempre son inmutables, puedes sobrescribir el getter y que devuelva un random, o el valor de una property mutable… Pero bueno, en un código donde nos ajustamos a ciertos reglas de inmutabilidad todo cobra más sentido.
Buen articulo para comenzar, ya quiero saber mas! de la guía de 15 min me pareció genial, lo fácil de acceder a los componentes del activity sin tener que declarar y castearlos , promete mucho Kotlin, seguiré adelante!!! Gracias.
Gracias a ti Andrés!
Buenas Antonio, hasta ahora estoy empezando a ver este lenguaje, por favor me puedes explicar la diferencia entre var y val.
En los ejemplos usas estos dos tipos de valores pero no sé la razón.
var x = 7
var y: String = «my String»
————–
val x: Int = 20
val y: Double = 21.5
Gracias
Hola Jorge! Cuando usas Val el valor de esa variable no se puede modificar una vez asignado. Sin embargo, con var sí que se puede modificar.
Si vienes de Java, es el equivalente a usar final o no en una variable.
Hola, me gustaría contestar a mis siguientes dudas:
¿Cómo le haces para evitar variables no finales? Porque Google pone los POJOS con tipo val, pero probablemente vamos a querer cambiarlas.
¿Cómo saber cuándo no se podrá inferir el tipo para hacerlo explícito?
¿Qué pasa si más de una clase tiene el mismo campo? Cómo sabe el compilador que casteo debe hacer?
– En el mundo inmutable, para modificar algo lo que necesitas es crear una copia y cambiar el valor correspondiente
– Si el IDE no lo puede inferir, te mostrará un error
– La última no la entiendo muy bien. El casting lo hace al objeto, no al campo en sí. Aunque dos clases tengan el mismo campo, el casting del objeto ya estará hecho en ese punto.