JetBrains ha anunciado que libera Kotlin, su lenguaje para la JVM y para javascript, bajo la licencia Apache 2. Este lenguaje ha venido siendo desarrollado por la empresa desde 2010 y ha alcanzando un importante punto de maduración que ha convencido a sus creadores de liberarlo.
Kotlin es un lenguaje de tipado estático que compila a bytecode de la JVM y a javascript, la empresa originalmente lo creó para aumentar su productividad. Como sabéis, Jetbrains desarrolla varios IDEs, entre ellos IntelliJ IDEA, sobre la JVM así que Kotlin fue su "mejora" a la JVM para auxiliarles en dicha tarea.
De acuerdo a su documentación, los principios de diseño que siguieron en Kotlin son
Como no puede faltar, aquí el Hola Mundo en Kotlin:
fun main(args : Array) { println("Hello, world!") }
Kotlin incorpora funcionalidades que no están en Java, un ejemplo, soporta módulos usando el sistema de dependencias a Maven y con un DSL para describirlos, un poco parecido a como se hace con Gradle:
val homeDir = "..." module("org.jetbrains.test") { depends(MavenRepo["junit.junit@4.8.2"]) importNamespace("java.lang") importNamespace("org.junit") sourceRoot("$homeDir/src") testSourceRoot("$homeDir/tests") }
En Kotlin, las variables puedes ser inmutables o mutables dependiendo de como se declaran, de igual forma que en Scala:
var a : String = "abc" a = "def" //ok val b : String = "abc" b = "def" //Error en compilación
Kotlin es más seguro para gestionar nulos, una variable no puede ser nula a menos que se declare así, por ejemplo:
var a : String = "abc" a = null //causa error de compilación
Pero esto si compila:
var b : String? = "abc" b = null
Cuando sabes que una variable puede ser nula puedes hacer uso del operador ?. (igual a como funciona en Groovy) para evitar NPEs:
b.length // puede darte un NPE b?.length //es una llamada segura, si el objeto es nulo no lanzará un NPE
Otro tema que me llamó la atención es que tienen soporte a Pattern Matching, una de las características más apreciadas de Scala, aunque aquí se usa con una sintaxis diferente:
when (x) { is Int -> print(x) is List -> print(x.sum()) !is Number -> print("Not even a number") else -> print("can't do anything") }
Y por último en este breve tour de Kotlin, las funciones de Extensión son basadas a las que existen en C# y que permiten agregar métodos a clases ya existentes sin modificar su código fuente. Por ejemplo, aquí se agrega el método swap a java.util.List:
fun List.swap(x : Int, y : Int) { val tmp = this[x] // 'this' corresponds to the list this[x] = this[y] this[y] = tmp }
Y se puede usar como sigue:
val l = list(1, 2, 3) l.swap(0, 2) // 'this' inside 'swap()' will hold the value of 'l'
Como veis, Kotlin incorpora características de varios lenguajes pero de de una forma más simple que por ejemplo Scala o el mismo Java. Como no podía faltar, cuenta con un plugin para IDEA. El lenguaje sigue en desarrollo pero ya puedes usarlo si lo instalas de este enlace o puedes probarlo directamente en la Web Console que se han creado para ello.