NOTA: Este artículo es una traducción manual de este otro artículo.

¡Por fin Kotlin ha pasado la fase Beta y ahora estamos enormemente complacidos de presentar la RC (Release Candidate)!

NOTA: como anunciamos previamente, la RC requiere que se recompile todo el código para asegurarnos de que no queda código de versiones antiguas por ahí (¡por favor, recompilad incluso si estabais en versiones EAP!).

Este blog da una visión de conjunto de los cambios que han ocurrido desde la Beta 4. Esta es la build con más cambios en la librería. Y también hemos corregido algunos bugs. Podéis encontrar la lista completa de cambios aquí.

Discursiones en Hacker News y Reddit.

Lenguaje

En primer lugar, como ya prometimos, ha habido una limpieza:

  • Las construcciones del lenguaje que habíamos deprecado ahora son errores en vez de avisos.
  • Hemos borrado todas las declaraciones deprecadas previamente en el código generado a nivel de byte code (como campos estáticos en interfaces y similares).

La mayor parte de los cambios en el lenguaje son pequeños ajustes y correcciones de errores. Vamos a destacar algunos, y podéis ver la lista completa aquí.

Anotaciones en los campos delegados

Ahora soportamos un nuevo objetivo de anotación: @delegate:. Por ejemplo, para marcar el objeto delegado como @Transient, podemos usar lo siguiente:

class Example {
    @delegate:Transient
    val foo by Lazy { ... }
}

A nivel de byte code, se anotará el campo que sustenta el delegado.

Comprobación de tipos en la variancia en sitios de uso

Hemos arreglado un conjunto de bugs relacionados con la variancia en sitios de uso (proyecciones de tipo). Como resultado, el compilador puede encontrar algunos bugs que se había escapado en el código. Por ejemplo, en el siguente caso:

val ints = mutableListOf(1, 2, 3)
val strs = mutableListOf("abc", "def")
val comps: MutableList&lt;out Comparable<*>> = ints
comps.addAll(strs) // ?! Adding strings to a list of ints

Antes el compilador aceptaba este c´ódigo por error y ahora produce un error en la última línea con el siguiente mensaje:

Projected type MutableList<out Comparable<*>> restricts the use of addAll()

Interoperabilidad con Java

Hemos hecho algunas mejoras a las propiedades sintéticas derivadas de los pares get/set de Java.

  • Dichas declaraciones (así como los métodos convertidos SAM) se resuelven a la par con miembros
  • Hemos añadido soporte a los setters de Java que devuelven valores.

Hemos añadido soporte para las anotaciones @Nullable/NotNull de varias librerías populares como javax.annotations, Android SDK, etc.

Los usuarios de EAP informan:

Las anotaciones de Android reconocidas me rompen un montón de código en el buen sentido

Y correcciones de errores destacadas:

  • Las clases de Kotlin privadas sin paquete ahora se compilan a clases Java privadas de paquete
  • Ahora no se puede acceder a los miembros privados de la clases desde funciones inline no privadas

Librería estándar

  • El código de la librería ahora está reordenado en paquetes más granulares (no debería hacer falta cambios en el código)
  • Hemos hecho inline algunas funciones
  • Muchas funciones inline (la mayor parte de una sola línea) ya no se pueden llamar desde Java. Esto nos ayudará a reducir el tamaño de la librería de runtime en un futuro.
  • Hemos borrado todas las cosas que habíamos deprecado previamente.
  • Ahora Map.getOrElse() y Map.getOrPut() tratan las claves asociativas con valores null como no encontradas.
  • Añadidas mutableListOf, mutableSetOf y mutableMapOf para construir colecciones mutables.
  • Añadida toMutableList en vez de toArrayList. La última está deprecada.
  • Se han añadido associate y associateBypara ayudar en la construcción de mapas (reemplazando a toMap/toMapBy)
  • Comparator y funciones relacionadas como comparaciones se han movido al paquete kotlin.comparisons (que no se importa por defecto).

Más cambios aquí.

Herramientas

Para habilitar las extensiones de Android en Gradle de una forma más ideomática, ahora podemos poner:

apply plugin: 'kotlin-android-extensions'

in el archivo build.gradle (de cada proyecto individual).

La forma antigua ya no funciona e imprime instrucciones para arreglarlo en la salida.

Cambios en el IDE

  • Intención para reemplazar la iteración sobre entradas de un mapa, con un bucle usando una destructuración
  • Inspección y quickfix para limpiar modificadores de visibilidad redundantes
  • Inspección para reemplazar llamadas assert con comprobaciones de variables nulables o no nulables con !! o ?: error(...)
  • Mostrar una notificación de “Kotlin not configured” al abrir un archivo .kt en el IDE si no está configurado el runtime de Kotlin en el módulo correspondiente
  • Acción para generar el método toString()
  • Soporte para implementar miembros mediante parámetros primarios de construcción
  • El popup con información de parámetros funciona para mostrar los parámetros genéricos
  • El competado ofrece variantes de nombre basados en identificadores sin resolver en el archivo actual
  • Quickfix para añadir ramas restantes en expresiones when
  • Soporte para mover clases anidadas al nivel superior o en otra clase raíz
  • Ya funciona @Supress en las inspecciones del IDE

Instrucciones de instalación

para los usuarios de IntelliJ IDEA, puede que las actualizaciones automáticas no funcionen en el IDE, así que necesitaréis descargar el plugin e instalarlo desde un archivo zip:

  • Descargarlo aquí
  • Ir a *Preferences Plugins and click Install plugin from disk…*

Sentimos las molestias

Estad atentos

La versión final se acerca… Mientras tanto: ¡que tengáis un buen Kotlin!

P.D: Ved las discursiones en Hacker News y Reddit.