
Kotlin siempre en mi equipo
Hace poquito te hablé de que había vuelto a Java y de que lo seguía odiando. En esta entrada entenderás parte del porqué. Quiero presentarte a Kotlin, uno de los lenguajes que más uso y que es pilar de mi stack de desarrollo. Es elegante y es potente. Me facilita la vida tanto a nivel docente como a nivel de desarrollador. Quiero que conozcas a uno de los lenguajes más completos que existen en el mercado y, después de conocerlo, quizás te pueda servir para tu desarrollo dada su versatilidad.
Un poco de historia
Kotlin es un lenguaje de programación de tipado estático, multiparadigma y multiplataforma que se ejecuta más ágil sobre la máquina virtual de Java y que también puede ser compilado a código fuente de JavaScript. Solamente con esto ya deberías prestarle toda la atención como desarrollador. Te facilita que con un solo lenguaje te muevas por el mundo de la JVM, la web y Node.js y dispositivos móviles, así como distintos sistemas operativos.
Piensa que es un lenguaje muy joven y que ha bebido de las mejores cosas que existen en los lenguajes actuales y que evoluciona rápidamente. Imagina que debes diseñar Java en el 2016. Ten por seguro que no lo harías como hace 30 años, pensando en la cantidad de programadores C/C++ que había y en hacer algo similar para ellos. Kotlin es una visión moderna de cómo debería ser un lenguaje de programación pensado para programar en los tiempos actuales.
Kotlin cubre todos los paradigmas, por lo que es ideal para enseñar: programación estructurada, modular, orientada a objetos y funcional. Además, como he dicho, es 100% interoperable con Java, por lo que puede usar todas sus clases y paquetes, lo que te da un abanico de librerías listas para usar y las de NPM, por ejemplo, si lo usas como lenguaje a compilar a JavaScript. Es Null-safe, lo que significa que no hay ningún problema con el manejo de null.
Desde mi punto de vista, el único problema de Kotlin es que ha estado muy ligado a lenguaje solo para Android. Esta es una de sus características, pero no la única, y aunque importante, hay mucho más que lo hacen un lenguaje potente, elegante y muy efectivo para desarrollar todo tipo de proyectos. Poco a poco te iré desgranando sus ventajas como lenguaje y como herramienta docente y quizás pueda convencerte de que lo uses.

Kotlin a nivel docente
¿Por qué aprender a programar con Kotlin o por qué enseñarlo?
Después hablaré de todas sus bondades técnicas, pero como docente que soy, y profesor en desarrollo de software, te voy a contar mi punto de vista de por qué Kotlin es un lenguaje muy bueno para aprender/enseñar programación.
Aprendizaje gradual
Kotlin te permite moverte siguiendo los distintos paradigmas existentes. Puedes usarlo como lenguaje para programación estructurada y modular, exprimir la programación orientada a objetos y asentar las bases de programación funcional.
Por ejemplo, cuando comenzamos un curso de programación usando Java, un simple "¡Hola, mundo!" tiene una carga conceptual enorme. ¿Qué hacemos? Podemos optar por pedirle al alumnado un acto de fe, obviar algunos conceptos o intentar explicarlos hasta "donde se pueda". Esto puede dar problemas como que el alumnado no entienda el porqué de algunos conceptos, o que no entienda qué es lo que hace el código, o que utilice por error o por defecto algunos elementos y adquiera vicios inapropiados, como el uso de static en todos lados.
Analicemos un "¡Hola, mundo!" en Java:
public class HolaMundo {
public static void main(String[] args) {
System.out.println("Hola mundo!");
}
}Como ves, nos aparecen varios conceptos como public (visibilidad), class (todo debe ser una clase sin haber comenzado los objetos), static (métodos de clases, sin ver OO), void (no devuelve nada), main (es el punto de entrada de la aplicación), String[] args (es un array de cadenas de texto), System (es una clase de Java que nos permite escribir en pantalla), out (indica la salida) println (es un método de la clase System que imprime en pantalla).
No voy a entrar si queremos hacer el típico programa que pida un dato o inicie un diálogo por consola y aparezca la clase Scanner y con ello la locura de por qué se hace así. Demasiada carga para tan poca cosa.
Repitamos el mismo ejemplo con Kotlin:
fun main() {
println("Hola mundo!")
}Kotlin está muy bien diseñado y te permite una curva de aprendizaje gradual, donde utilizas lo que necesitas cuando lo necesitas, evitando escribir o utilizar conceptos que no necesitas y pueden ser más complicados de entender cuando uno comienza a programar y usando la sintaxis justa en el momento justo, y no siendo tan verboso como Java.
A partir de aquí puedes ir aprendiendo y dominando nuevos conceptos desde tipos, funciones, clases, objetos, colecciones, funciones lambda, etc.
Sigues usando el ecosistema de Java
Todas tus clases, librerías y programas existentes en Java son 100% compatibles con Kotlin. Es decir, si tu programa necesita una clase de Java, puedes usarla en Kotlin. Puedes hacer uso de Maven para instalar librerías de Java en tu proyecto e incluso de Maven/Gradle para gestionarlo.
Di "hola" a JS
Además, Kotlin te permite ser compilado a JavaScript. Si necesitas aplicaciones que hagan uso de JavaScript, puedes usar Kotlin y luego convertirlo a JavaScript. Además, te permite no solo aplicaciones web, sino en Node.js, o usar frameworks como Express, React, etc. Tienes NPM a tu disposición para cualquier librería.
Lenguaje puente
Kotlin te permite saltar de Java a JavaScript, con una sintaxis a medio camino entre el primero y TypeScript. Aprendiendo Kotlin podrás migrar fácilmente a estos dos últimos.
Kotlin y docentes
- Fácil de aprender.
- Multiparadigma y multiplataforma.
- JVM, Node.js, web, Maven Central y NPM.
- Con Kotlin puedes aprender otros lenguajes facilitando el salto.
Elementos de Kotlin
A continuación voy a resumirte elementos de Kotlin que pueden interesarte.
Programación estructurada y modular
- Kotlin es un lenguaje orientado a objetos con tipado estático. Aun así, define unos tipos como primitivos para facilitarnos su uso. También tenemos cadenas y arrays, ideales para comenzar a programar. De hecho, tiene los String Templates, que vienen fantásticos para no perderte concatenando elementos.
- El control de flujo se puede realizar con elementos conocidos como condicionales, bucles definidos e indefinidos. Destacamos el when, que es un condicional múltiple supervitaminado, y el for, que al moverse con rangos nos facilita no usar comparaciones tediosas que pueden provocar errores.
- Las funciones son otro punto a favor. Podemos definir funciones con un número variable de parámetros. Además, podemos definir funciones en línea, de extensión (de lo mejor que podrás encontrarte) y sobrecarga de operadores de la manera más sencilla.
- Seguridad ante nulos: el null es un problema y desde su concepción se ha tratado de evitar de distintas maneras. Es aquí donde Kotlin tiene uno de sus puntos fuertes gracias a su facilidad para detectarlos, protegerse ante ellos y hacer instrucciones que realicen alguna acción en caso de no serlo, sin recurrir a complicadas comparaciones u objetos Optionals.
Programación orientada a objetos
- Kotlin trabaja con clases y objetos: Clases. Podemos tener constructores en la misma definición de clase e inicializadores. Para instanciar no necesitamos new.
- La herencia es simple para clases, pero múltiple para interfaces. Los métodos y variables de clase se incluyen en los objetos de tipo "companion", lo que los dota de esa característica especial que tiene un elemento de clase.
- Las propiedades y los getter&setter ya van de serie y depende de su visibilidad y si se definen como var o val (variables o constantes). De esta manera podemos implementar el patrón Builder de una manera muy simple.
- Clases específicas: gracias a notaciones como Data podemos crear clases para solo almacenar datos (típicas POJO en Java) en una sola línea. Con Object podemos crear clases siguiendo el patrón Singleton. Con todo lo indicado quizás no necesitemos recurrir a Lombok más.
Kotlin
data class Person(var name: String, var surname: String, var id: String)Java
public class Person {
private String name;
private String surname;
private String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if (name != null ? !name.equals(person.name) : person.name != null) return false;
if (surname != null ? !surname.equals(person.surname) : person.surname != null)
return false;
return id != null ? id.equals(person.id) : person.id == null;
}
@Override public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (surname != null ? surname.hashCode() : 0);
result = 31 * result + (id != null ? id.hashCode() : 0);
return result;
}
@Override public String toString() {
return "Person{" +
"name='" + name + ''' +
", surname='" + surname + ''' +
", id='" + id + ''' +
'}';
}
}- Genéricos: con ellos podemos dotar de toda la potencia de la programación genérica, pensando en qué queremos hacer y no con qué tipo.
Colecciones
Vale, podría ir en el apartado anterior. Aparte de poder usar todas las de Java, Kotlin tiene una serie de colecciones que puedes usar con una característica muy importante: poder trabajar con la mutabilidad e inmutabilidad.
De esta manera podemos trabajar, por ejemplo, con listas constantes de solo lectura. Una gran ventaja para no meter la pata. Es decir, una lista de solo lectura, que sería un dolor de cabeza en Java, aquí la tienes de serie. Por supuesto todas trabajan con estructuras funcionales si se da el caso, sin recurrir a los streams como parche o transformando los objetos.

Programación funcional
Kotlin es un lenguaje que se mueve muy bien con la programación funcional y las lambdas, pues fue concebido para ello y no es un añadido como en otros lenguajes. Por lo que todo resulta muy natural y sencillo, pues bebe de su "primo" Scala.
A partir de aquí tenemos una serie de operaciones usando este paradigma para el manejo de colecciones. Operaciones para realizar transformaciones, filtrado, adiciones y sustracciones, agrupamiento, recolección de datos, ordenamiento o funciones de agregación. Lo que necesites y más.
Programación concurrente
Kotlin puede hacer uso de hilos, callbacks y futures (promesas de Java) para hacer uso de la programación concurrente y mecanismos de sincronización conocidos (semáforos, monitores, synchronized, etc.). Pero su punto fuerte es el uso de las corrutinas. Una corrutina (definida también como un hilo liviano y optimizado) es un conjunto de sentencias que realizan una tarea específica, con la capacidad de suspender o reanudar su ejecución sin bloquear un hilo. Esto permite que tengas diferentes corrutinas cooperando entre ellas, suspendiéndose y reanudándose en puntos especificados por ti o por Kotlin. Con ellas podemos ejecutar código en paralelo y/o asíncrono de una forma muy sencilla y óptima. No significa que exista un hilo por cada corrutina; al contrario: puedes ejecutar varias en uno solo.
suspend fun fetchTwoDocs() =
coroutineScope {
val deferredOne = async { fetchDoc(1) }
val deferredTwo = async { fetchDoc(2) }
deferredOne.await()
deferredTwo.await()
}Con ellas podrás crear tu propio procesamiento concurrente optimizando los recursos del sistema. Este comportamiento de las corrutinas en Kotlin te permite:
- Reducir recursos del sistema al evitar la creación de grandes cantidades de hilos.
- Facilitar el retorno de datos de una tarea asíncrona.
- Facilitar el intercambio de datos entre tareas asíncronas.

Programación de servicios
Kotlin te permite trabajar con el Back-end de tu aplicación de manera muy efectiva. Puedes usar Spring sin ningún problema y con una gran cantidad de funcionalidades. Si tu excusa para no usar Kotlin en el back era Spring, ya se te ha acabado. Con ello podrás hacer, por ejemplo, tu API REST.

Pero quizás quieras crear servicios web de una manera asíncrona y sencilla. Kotlin pone a tu disposición Ktor para ello. No necesitas Spring o Express para hacer una API REST o GraphQL de manera rápida.
Por otro lado, puedes usar JPA sobre Hibernate o Spring Data para trabajar en tu acceso a datos a cualquier tipo de base de datos. También podemos usar JAXB para XML, o GSON o Jackson para JSON, Java NIO2 o las propias funciones de Kotlin para ficheros.
¿Quieres más? Necesitas moverte con Node.js. ¿Un back sobre Express?, ¿librerías de NPM? Con Kotlin puedes hacerlo. Puedes crear tus aplicaciones en Node.js.
Desarrollo de clientes
Con Kotlin puedes crear el cliente que quieras o como quieras. JVM: puedes usar JavaFX o cualquier paquete de Java para implementar tu cliente. JavaScript/Web: puedes usar Kotlin para crear tu cliente o aplicación web como lenguaje tipado. Puedes trabajar en Vanilla JavaScript o con frameworks tan conocidos como React.

Por supuesto puedes trabajar para móviles: todos conocemos su potencial sobre Android. Pero además nos permite realizar desarrollos para iOS.
Pero el gran paso para poder hacerlo todo y en todas las plataformas con Kotlin es Compose, o cómo crear interfaces de usuario de manera declarativa y con ello poder crear nuestras aplicaciones para Windows, Mac, Linux, Android, iOS, web, etc.

Testing
Obviamente para nuestros tests podemos hacer uso de JUnit o Mockito. Pero además tenemos nuestras librerías propias para ello.
Desarrollo nativo
Si tu problema es el escepticismo del rendimiento sobre JVM, también puedes desarrollar nativamente con interoperabilidad con C u Objective C.
Ciencia de los datos
Kotlin puede ser una gran alternativa para la ciencia de los datos. Puedes usar sus librerías e integración, por ejemplo, con terceros.
DSL y Kotlin
Kotlin puede ser usado como lenguaje de dominio específico para resolver determinadas tareas de una manera rápida y muy legible.

Patrones de diseño
Kotlin puede ser usado sobre patrones de diseño y aprovechar su sintaxis para hacerlos más asequibles y fáciles de implementar: ya hemos hablado de cómo conseguir por ejemplo Singleton con la notación object. A continuación mostramos un simple ejemplo para el patrón Builder.
class FoodOrder private constructor(
val bread: String?,
val condiments: String?,
val meat: String?,
val fish: String?) {
data class Builder(
var bread: String? = null,
var condiments: String? = null,
var meat: String? = null,
var fish: String? = null) {
fun bread(bread: String) = apply { this.bread = bread }
fun condiments(condiments: String) = apply { this.condiments = condiments }
fun meat(meat: String) = apply { this.meat = meat }
fun fish(fish: String) = apply { this.fish = fish }
fun build() = FoodOrder(bread, condiments, meat, fish)
}
}Shell y Scripting
Quizás te guste Node.js y su consola. Si ejecutamos el compilador sin parámetros, entraremos en la consola de Kotlin, donde podemos ejecutar código de Kotlin y ver sus resultados.

Además podemos usar Kotlin como lenguaje de scripting con ficheros .kts. Un ejemplo:
Ejemplo de script llamado:
import java.io.File
// Toma el path pasado en -d, o el path actual
val path = if (args.contains("-d")) args[1 + args.indexOf("-d")]
else "."
val folders = File(path).listFiles { file -> file.isDirectory() }
folders?.forEach { folder -> println(folder) }Podemos llamarlo como:
$ kotlinc -script list_folders.kts -- -d <path_folder>Kotlin vs Java
No se trata de una guerra, sino de que cada cual elija según sus intereses programando.

Aprende Kotlin
Cursos y documentación
En YouTube, mis preferidos y siempre recomendados son:
Antonio Leiva DevExperto.
Brais Moure MoureDev.
Conclusión
Kotlin ha supuesto un gran avance en el ecosistema de la JVM; de hecho, muchos de los avances de Java desde la versión 8 vienen de "inspirarse" en Kotlin. No voy a negar que coincido con las palabras de un desarrollador del ecosistema de Spring: "Lo mejor que le puede pasar a un desarrollador de Java es codificar en Kotlin". También espero haber conseguido que dejes de ver a Kotlin como el lenguaje que solo sirve para programar en Android y lo tengas en cuenta para más tipos de desarrollos.
Uno de los objetivos que tengo pendientes, y quiero realizar, es mostrar cómo muchas partes del temario de DAM y DAW se pueden desarrollar con Kotlin. Para ello realizaré apuntes y prácticas tipo. Los compartiré en mi repositorio y web. De hecho, como ves, cubre todo el temario de ambos ciclos y más. Deseo que tú, como alumno o docente, te animes a usar Kotlin, no solo para Android, y con esta entrada hayas descubierto cómo este lenguaje te puede aportar experiencias muy positivas para tus desarrollos. Y si podemos compartirlo, mucho mejor.
En mi repositorio tienes ya algunos proyectos tipo. Si necesitas algo más, no dudes en contactar conmigo.

