Nos complace anunciar otra actualización beta de Kotlin 1.0. Estamos enfocados en finalizar
la librería estándar y en deshacernos de las construcciones deprecadas del lenguaje, así como
arreglar bugs, mejoras de rendimiento y comprobaciones en vistas al futuro.
Podéis encontrar la lista completa de cambios aquí.
Estamos trabajando duro en la librería estándar para que esté en el mejor estado posible
antes de la 1.0. Esto incluye algo de experimentación, así deprecamos algunas cosas y añadimos algunas funciones. Tenemos planeado hacer la última limpieza de la librería estándar en la build 1.0 (o en la RC): quitar todas las cosas legadas y deprecadas.
En relación a esto únicamente vamos a destacar un cambio: <code class="highlighter-rouge">contains()
y otras extensiones similares ahora aceptan supertipos de los elementos de la colección.
`// strs: Collection // ns: String? // cs: CharSequence // i: Int strs.contains(ns)// accepted now strs.contains(cs)// accepted now str.contains(i)//ERROR(infact,adeprecationwarning,butwillbeanerrorsoon)`
Nos hemos dado cuenta de que la aproximación propuesta anteriormente `containsRaw` era ineficiente, y hemos optado por hacer `contains()` algo más permisivo, a la vez que
mantenemos la seguridad que queríamos inicialmente. Nótese que la interfaz de las colecciones
en sí misma se mantiene intacta, y que todo esto se hace exclusivamente mediante funciones de extensión. Usad *Code Cleanup* para migrar el código.
Cambios en el lenguaje
Algunas cosas destacadas sobre los cambios en el lenguaje, la lista completa se puede
encontrar aquí.
Muchas de las cosas que habíamos deprecado ahora son errores. Usad Code Cleanup para migrar.
Expresiones when
Tenemos comprobado que este tipo de código suele ser problemático y lo hemos deprecado:
Mucha gente solía pensar que la condición `foo.isValid(), foo.isReady()` significaba que foo era válido y a la vez estaba listo, pero en realidad la coma representa una disyunción. La solución es trivial: simplemente reemplazar la coma por
.
`when{ foo.isValid()||foo.isReady()->process(foo) ... }`
*Code Cleanup* os ayudará a migrarlo.
Anotaciones
Hemos arreglado un bug que nos impedía usar arrays en valores por defecto para los parámetros de las anotaciones:
`annotationclassEntry(valvalue:String)
annotationclassExample( valentries:Array<Entry>=arrayOf(Entry("a"),Entry("b"))// OK now )`
## Enum.values()
Recientemente cambios el <code class="highlighter-rouge">Enum.values() tradicional de Java para convertirse en una propiedad: <code class="highlighter-rouge">Enum.values, pero vamos a revertir este cambio porque hay un caso límite bastante peliagudo: un enumerado podría tener un elemento llamado values, y entonces sería imposible acceder a alguno de los dos. Hemos considerado varias opciones, y hemos decidido que hacer que values vuelva a ser una función es el más limpio.
Así que la propiedad values pasa ahora a estar deprecada y la función <code class="highlighter-rouge">values() deja de estar deprecada.
Reglas de visibilidad y alcance
Vamos a proceder a limpiar y arreglar problemas menores en las reglas de visibilidad y alcance (scopes), de forma que:
Se permiten miembros <code class="highlighter-rouge">protected en los companion object
Llamar a miembros <code class="highlighter-rouge">protected que no estén marcados con @JvmStatic desde subclases, ahora serán errores (no soportado)
Los setters <code class="highlighter-rouge">private en las propiedades <code class="highlighter-rouge">open
Hemos deprecado las clases locales <code class="highlighter-rouge">sealed (nunca fueron usables)
No permitimos reducir la visibilidad en la sobrecarga de los setters
Ya no permitimos clases internas dentro de las entradas de los enum
No permitimos el uso de variables sin inicializar en lambdas / literales de objeto / funciones locales.
Extensiones de Android
Hemos combinado el plugin principal de Kotlin para InteliJ IDEA con el plugin Kotlin Extensions For Android. El plugin de extensiones de android queda obsoleto ya que su funcionalidad está incluída en el plugin principal de Kotlin.
También hemos añadido soporte para los <code class="highlighter-rouge">product flavors de Android: ahora las propiedades de los distintos flavours están disponibles en diferentes paquetes.
Por ejemplo, si tenemos dos <code class="highlighter-rouge">flavors en el archivo <code class="highlighter-rouge">build.gradle:
`productFlavors{ free{ versionName"1.0-free" } pro{ versionName"1.0-pro" } }`
Ahora podemos usar propiedades sintéticas no solo para los layouts en el fuente principal, sino también en los layouts de los `flavor`:
`// Import synthetic properties for the `activity_free.xml` layout in the `free` flavor importkotlinx.android.synthetic.free.activity_free.versionMarker
versionMarker.text="Free version" } }`
Notad que todos los layouts para el set de fuentes principal está localizado en el paquete `kotlinx.android.synthetic.main`, y que hemos deprecado la convención de nombres de los viejos paquetes.
Novedades en el IDE
Hemos combinado el plugin de Extensiones de Android Extensions en el plugin principal y ya no hace falta instalarlo por separado
Hemos añadido la opción de elegir Kotlin cuando creamos un proyecto Gradle nuevo:
Debugger: la navegación de stacktraces ahora permite ver los frames de las funciones inline. También hemos hecho un montón de mejoras a la hora de ir paso a paso en las funciones inline.
Hemos añadido tres Quick Fixes a la inicialización de propiedades: