Antes de nada, quiero que sepas que llevo desarrollando en Java desde hace más de 10 años por lo que he seguido su evolución muy de cerca. Java, aunque muy lentamente, va evolucionando añadiendo características que poseen lenguajes más modernos como puede ser opcionales, lambdas o streams.
El problema está en que su ritmo de evolución es demasiado lento y, además, están obligados a preservar su verbosidad intrínseca haciendo que muchas de las nuevas características no sean tan agradables de usar como debieran.
Kotlin
Kotlin es un nuevo lenguaje desarrollado por JetBrains. Por si no los conoces son los creadores de, en mi opinión, los mejores IDEs del mercado: IntelliJ / Android Studio, AppCode, ReSharper o Rider.
Kotlin es un lenguaje de tipado estático que compila a bytecode de la máquina virtual de Java (JVM) o incluso a JavaScript. Ésto quiere decir que puede usarse en cualquier sitio donde haya una JVM ejecutando bytecode. Personalmente, considero que viene para reemplazar a Java en aquellos lugares dónde usar otros lenguajes basados en JVM son inviables de usar o demasiados grandes añadiendo muchos nuevos métodos en sus librerías.
A diferencia de otros lenguajes como puede ser Scala que viene del sector académico, Kotlin viene de la industria (de JetBrains cómo te mencioné antes) con un periodo de diseño, iteración y desarrollo muy largo para convertirlo en un producto muy maduro desde su primera versión estable, con el objetivo de resolver problemas que a día de hoy tenemos todos los programadores de Java.
Otro de los objetivos importantes en su diseño es que sea 100% compatible e interoperable con Java: ejecutar código Java desde Kotlin o viceversa (código Kotlin desde Java) sin problemas. ¿Qué quiere conseguir JetBrains con ésto? Dos cosas:
- Minimizar la barrera de entrada permitiendo que, por ejemplo, no tengas que esperar a desarrollar un nuevo producto para empezar a utilizarlo sino que puedas empezar a utilizar Kotlin en todo nuevo código que desarrolles sin tener que preocuparte por la compatibilidad.
- Tener a tu disposición cualquier librería y/ framework escrito en Java disponible actualmente desde el primer día.
Por si esto fuera poco Kotlin no es solo un lenguaje, sino que es una dupla de lenguaje y plugin para diferentes entornos de desarrollo. Entre las características que ofrece está el auto-completado, soporte completo para depuración, refactors e incluso un convertidor de Java a Kotlin. El plugin está disponible (en el momento de escribir este post) para todos los IDEs más usados:
Características
Voy a empezar enseñándote un simple ejemplo para que veas la diferencia de verbosidad entre Java y Kotlin:
El típico POJO de, en este caso, 3 campos que en Java ocupa 24 líneas en Kotlin es simplemente una 😍.
No quiero enrollarme mucho contando las bondades de Kotlin, porque no son pocas y quedaría un post muy largo, así que voy a detallar las que considero que son las más importantes:
- OpenSource con una comunidad muy viva.
- Sintaxis clara y concisa, quita toda la verbosidad intrínseca de Java. Puede ser aprendido en cuestión de horas.
- Opcionales. Adiós a
NullPointerException
. Algo puede sernull
únicamente si indicas que puede serlo. - Inferencia de tipos. Es decir, dejamos al compilador que sea capaz de inferir los tipos que estoy usando y me ahorre declaralos de antemano. Ej.:
val text = “Hola”
- Data classes. Autogeneración de boilerplate para POJOs (
getters/setters
,hashCode
,equals
,toString
, etc.). - Extensiones. Di adiós a las clases Utils. Permite añadir nuevos métodos a clases sin necesidad de tener acceso a ellas. Te hablaré sobre ellos en próximos posts 😉.
- Funcional. Soporte para Programación Funcional.
- Inmutabilidad por defecto. Contra menos variables mutables tengas más seguro será tu programa, sobre todos en entornos multithreading. Kotlin te ayuda e incentiva a que utilices tantos datos inmutables como sea posible.
- Operadores. Añade soporte a tus clases de operadores como
+
,-
,*
, etc. Por ejemplo, Kotlin añade operadores a las colecciones básicas de Java por lo que puedes sumar dos listas de forma sencilla:val newList = list1 + list2
, ésto devolverá una nueva lista con el contenido de ambas listas. - Sealed Classes. Los enum del futuro. Escribí sobre ellos aquí.
- Propiedades Lazy. Propiedades que inicializan su valor cuando, por ejemplo, son usadas por primera vez.
- Compila a Java 1.6. Éste es el GRAN punto para los desarrolladores Android como yo 😉.
¿Porqué uso Kotlin?
Android nació con soporte para Java 1.6 (lanzado en 2006) añadiendo soporte casi completo para Java 1.7 más adelante, digo casi completo porque hay cosas como Try with Resources que sólo es soportado desde KitKat (API Level 18).
Hace muy poco se añadió soporte para Java 1.8 que trae soporte para características modernas como Lambdas, Method References o Type Annotations. La pega es que sólo están disponibles si tu aplicación soporta dispositivos desde Marshmallow (API Level 23) hacia arriba, haciéndolo inservible a día de hoy porque normalmente queremos abarcar el máximo dispositivos posibles cuando desarrollamos una aplicación.
Resumiendo, en Android estamos desarrollando en una especie de Java 1.65, es decir, usando herramientas que se lanzaron ¡hace más de 10 años!. Afortunadamente, ahora tenemos la posibilidad de usar Kotlin que viene a resolver muchos de éstos problemas.
Como te dije antes, Kotlin compila a bytecode de Java 1.6 por lo que es compatible con todos los dispositivos Android. Aún usando bytecode antiguo es capaz de darnos características modernas (algunas que empieza a traer Java 8) como puede ser Lambdas o Opcionales y, además, ser capaz de seguir evolucionando el lenguaje con cada nueva versión (ofreciendo retrocompatibilidad).
Desde el punto de vista de desarrollador Android puro Kotlin está perfectamente integrado con el ecosistema. Tiene soporte total con Android Studio y, además, incluye plugins y librerías adicionales para ayudarnos en el día a día del desarrollo en Android (Anko o Kotlin Android Extensions, hablaré sobre ellos en el futuro).
El soporte que está brindando JetBrains es espectacular, responden con mucha rapidez a cualquier problema y, además, tienen un Slack oficial sobre Kotlin dónde cualquiera puede resolver sus dudas casi instantáneamente. Es muy activo. Lo recomiendo 100%.
Existen otras alternativas a Java para desarrollar aplicaciones en Android sobre JVM como puede ser Scala, pero en mi opinión son muy pesadas y las herramientas disponibles para Android no están al nivel de lo que ofrece Kotlin desde el primer día.
¿Quién está usando Kotlin?
Aquí puedes ver algunas productos y empresas que ya están usando Kotlin:
Un montón de grandes empresas ya han confiando en Kotlin para sus productos por lo que, en mi opinión, Kotlin no es el futuro sino el presente.
Conclusión
Sinceramente, no veo razón ninguna para seguir anclado a Java teniendo a nuestra disposición un lenguaje como Kotlin que en el caso de tener algún problema o incompatibilidad (aún no me he encontrado con ninguno) poder escribir en Java esa parte sin problema.
Espero haberte convencido, tanto si es así como sino te animo a que le des una oportunidad al lenguaje y pruebes sus bondades de primera mano 🙂.