Kotlin 2.4.0 ya es oficial: context parameters estables, UUID API y soporte para Java 26

Kotlin 2.4.0 ya está aquí. JetBrains lo publicó el 11 de agosto de 2026, y aunque no trae ningún cambio de los que obligan a reescribir proyectos, sí que consolida varias piezas que llevaban tiempo en fase experimental. Los context parameters y los explicit backing fields pasan a estable, la API de UUID por fin se da por cerrada, y el compilador ya genera bytecode compatible con Java 26.

Vamos por partes, porque hay bastante contenido para desarrolladores que trabajan en JVM, Kotlin/Native o Kotlin/Wasm.

Context parameters: estable de una vez

Esta es probablemente la novedad con más recorrido. Los context parameters permiten pasar dependencias de forma implícita a una función, sin ensuciar la firma con parámetros que en realidad son infraestructura:

class EmailSender
class SmsSender

context(emailSender: EmailSender)
fun sendNotification() {
    println("Sent email notification")
}

context(smsSender: SmsSender)
fun sendNotification() {
    println("Sent SMS notification")
}

Junto a esto llega, en modo experimental, la posibilidad de pasar argumentos de contexto de forma explícita cuando hay ambigüedad entre varias sobrecargas:

context(defaultEmailSender: EmailSender, defaultSmsSender: SmsSender)
fun notifyUser() {
    sendNotification(emailSender = defaultEmailSender)
    sendNotification(smsSender = defaultSmsSender)
}

Explicit backing fields, ya estables

Otra pieza que llevaba un tiempo cocinándose: ahora se puede acceder de forma explícita al backing field de una propiedad con la palabra clave field, sin recurrir al truco de siempre de declarar una propiedad privada y otra pública encima:

var name: String
    field = value
    get() = field.uppercase()

Novedades experimentales en el lenguaje

Kotlin 2.4.0 también estrena, en modo experimental, sintaxis de collection literals para crear listas sin llamar a listOf() o mutableListOf():

val shapes: MutableList<String> = ["triangle", "square", "circle"]
val fruit = ["apple", "banana", "cherry"]

Y se amplía el soporte de constantes evaluadas en tiempo de compilación, ahora con operaciones sobre tipos sin signo y funciones de string:

const val MAX_UNSIGNED = UInt.MAX_VALUE.toString()
const val LOWERCASE = "HELLO".lowercase()

La librería estándar también se mueve

La API de UUID llega a estable, sin florituras: Uuid.random() y Uuid.parse() ya se pueden usar en producción sin el aviso de API experimental. Se añaden también funciones para comprobar si una colección está ordenada:

val numbers = listOf(1, 2, 3, 4)
println(numbers.isSorted())

data class User(val name: String, val age: Int)
val users = listOf(User("Alice", 24), User("Bob", 31))
println(users.isSortedBy(User::age))

Y hay una distinción fina, pero útil, entre dos formas de rellenar un mapa: una que sustituye un valor null existente y otra que respeta la clave aunque su valor sea null:

val map = mutableMapOf<String, String?>("user" to null)

map.getOrPutIfNull("user") { "default_user" }
map.getOrPutIfMissing("user") { "default_user" }

Kotlin/JVM: soporte para Java 26

El compilador ya genera bytecode compatible con Java 26, y las anotaciones se escriben ahora en los metadatos de Kotlin junto al bytecode por defecto, así los annotation processors pueden acceder a ellas sin recurrir a reflexión.

Kotlin/Native: GC concurrente por defecto y Swift más cerca

El recolector de basura de marca concurrente (CMS GC) pasa a ser el que se usa por defecto en Kotlin/Native, con el objetivo de mejorar pausas y capacidad de respuesta. Quien lo necesite puede volver al anterior con kotlin.native.binary.gc=pmcs.

Para quien combina Kotlin y Swift en el mismo proyecto, hay dos novedades relevantes. Primero, ya se pueden declarar paquetes Swift como dependencias directamente desde Gradle:

kotlin {
    swiftPMDependencies {
        swiftPackage(
            url = url("https://github.com/firebase/firebase-ios-sdk.git"),
            version = from("12.11.0"),
            products = listOf(product("FirebaseAI"), product("FirebaseAnalytics"))
        )
    }
}

Segundo, Swift export sigue en alpha pero avanza: ya soporta concurrencia estructurada (una función suspend de Kotlin se puede llamar con await desde Swift) y exportación de Flow como AsyncSequence. El compilador LLVM que usa Kotlin/Native pasa a la versión 21, y suben las versiones mínimas de Apple soportadas: iOS/tvOS a 15.0, macOS a 12.0 y watchOS a 8.0.

Kotlin/Wasm: compilación incremental por defecto

La compilación incremental para Kotlin/Wasm pasa a estar habilitada por defecto, lo que debería notarse en los tiempos de build de proyectos grandes. Además entra en fase experimental el soporte para el WebAssembly Component Model, pensado para construir componentes reutilizables y aplicaciones tipo FaaS/serverless.

Kotlin/JS: exportar value classes a TypeScript

Ahora se pueden exportar inline value classes a TypeScript, algo que hasta ahora quedaba fuera del alcance de @JsExport:

@JsExport
@JvmInline
value class Email(val address: String) {
    init {
        require(address.contains("@")) { "Invalid email" }
    }
}

También se preserva la varianza de los tipos genéricos al generar los .d.ts, y el inlining de JS ya soporta características de ES2015 como el spread operator dentro de bloques js("...").

Cambios de compatibilidad a tener en cuenta

El compilador K1 deja de estar soportado (la opción -language-version=1.9 desaparece), y se elimina el plugin Maven KotlinScriptMojo para ejecución de scripts. Nada dramático si el proyecto ya usa K2, pero conviene revisarlo antes de actualizar en un pipeline de CI.

Para quien gestiona proyectos con Gradle, Kotlin 2.4.0 es compatible con las versiones 7.6.3 a 9.5.0, con AGP mínimo 8.5.2. Y en Maven, ahora se puede alinear automáticamente la versión de Java/JVM con la propiedad maven.compiler.release sin duplicar configuración.

En conjunto, es una actualización de las que no dan titulares, pero que quita bastante código de compatibilidad manual del día a día: menos boilerplate para pasar dependencias implícitas, una API de UUID por fin cerrada, y un puente cada vez más sólido entre Kotlin y Swift para quien mantiene apps multiplataforma.

Más información y la lista completa de cambios, en la documentación oficial de Kotlin 2.4.0.

Si quieres ver cómo encaja esto con el resto del ecosistema Kotlin, puedes revisar nuestros artículos sobre Kotlin Multiplatform y Kotlin/Wasm.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP