Avec Kotlin 1.5.30, vous pouvez également profiter de la prise en charge native d'Apple Silicon, de la promotion du backend Kotlin/JS IR en version bêta, de la possibilité d'utiliser des bibliothèques cinterop personnalisées dans le code natif partagé des applications multiplateformes, de la prise en charge des chaînes d'outils Java fournies par le plugin Kotlin Gradle, et bien plus encore.
Nous présentons dans la suite les principales nouveautés de manière plus détaillée.
Langage
La feuille de route de Kotlin inclut l'ajout de la prise en charge des instructions sealed when, la disponibilité des annotations d'activation (opt-in), l'amélioration de l'inférence de type et la stabilisation de l'inférence du builder. Kotlin 1.5.30 franchit une étape dans cette voie en proposant un aperçu de ces fonctionnalités, dont la sortie est prévue pour la version 1.6.0 du langage.
Instructions sealed when
Avez-vous une fonction utilitaire dans votre base de code qui rend l’instruction when de Kotlin exhaustive ? JetBrains espère que vous n’en aurez bientôt plus besoin. L'éditeur de logiciels pour les développeurs prévoit d’introduire sealed when, une fonctionnalité attendue depuis longtemps qui a généré plus de 280 votes dans YouTrack. Si vous activez cette fonctionnalité dans la version 1.5.30, le compilateur Kotlin vous avertira si l'une de vos instructions when n'est pas exhaustive. Cela améliorera la sécurité de votre code sans que vous ayez à introduire vos propres fonctions.
Prise en charge des fonctions suspend en tant que super types
Kotlin 1.5.30 fournit un aperçu de la possibilité d'utiliser des types fonctionnels suspend en tant que super interfaces, bien qu'il présente certaines limitations. C'est l'une des pièces manquantes dans la conception des coroutines de Kotlin.
Code : | Sélectionner tout |
1 2 3 | class MyClass: suspend () -> Unit { override suspend fun invoke() { TODO() } } |
Annotations d'activation (opt-in)
Comme étape supplémentaire vers la publication des annotations opt-in, Kotlin 1.5.30 :
- présente de nouvelles règles pour l'utilisation et la déclaration d'exigences d'annotations opt-in sur différentes cibles ;
- nécessite un opt-in même pour les utilisations implicites d'une API expérimentale. Par exemple, si le type de retour de la fonction est marqué comme élément d'API expérimental, une utilisation de la fonction vous oblige à vous l'activer même si la déclaration n'est pas marquée comme nécessitant explicitement une activation.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // Library code @RequiresOptIn(message = "This API is experimental.") @Retention(AnnotationRetention.BINARY) @Target(AnnotationTarget.CLASS) annotation class MyDateTime // Opt-in requirement annotation @MyDateTime class DateProvider // A class requiring opt-in // Client code // Warning: experimental API usage fun createDateSource(): DateProvider { /* ... */ } fun getDate(): Date { val dateSource = createDateSource() // Also warning: experimental API usage // ... } |
Améliorations de l'inférence de type sur les types génériques récursifs
Avec l'inférence de type sur les types génériques récursifs activée, le compilateur Kotlin 1.5.30 peut déduire un argument de type en se basant uniquement sur les limites supérieures du paramètre de type correspondant s'il s'agit d'un générique récursif. Cela permet de créer divers modèles avec des types génériques récursifs qui sont souvent utilisés en Java pour créer des API de builder.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // Kotlin 1.5.20 val containerA = PostgreSQLContainer<Nothing>(DockerImageName.parse("postgres:13-alpine")).apply { withDatabaseName("db") withUsername("user") withPassword("password") withInitScript("sql/schema.sql") } // Kotlin 1.5.30 val containerB = PostgreSQLContainer(DockerImageName.parse("postgres:13-alpine")) .withDatabaseName("db") .withUsername("user") .withPassword("password") .withInitScript("sql/schema.sql") |
Élimination des restrictions d'inférence du builder
Avec l'élimination des restrictions d'inférence de builder activée, Kotlin 1.5.30 supprime une restriction d'inférence de builder. Non seulement vous pouvez spécifier les informations de type que l'inférence du builder peut déduire, mais vous pouvez également utiliser la fonction get dessus. Par exemple, vous pouvez appeler get() dans un argument lambda de buildList() sans arguments de type explicitement spécifiés.
Kotlin Multiplatform
Kotlin 1.5.30 inclut les améliorations suivantes pour Kotlin Multiplatform :
- Possibilité d'utiliser des bibliothèques cinterop personnalisées dans du code natif partagé, ce qui étend la possibilité de partager des bibliothèques dépendantes de la plateforme livrées avec Kotlin/Native.
- Prise en charge de XCFrameworks comme format de sortie pour tous les projets Kotlin Multiplatform. XCFrameworks aide à rassembler la logique pour toutes les plateformes et architectures cibles dans un seul ensemble et ne nécessite pas de supprimer les architectures inutiles avant de publier l'application sur AppStore.
- Nouvelle configuration de publication par défaut pour les artefacts Android. Cette configuration sera compatible avec tout type de build par défaut. Avant la version 1.5.30, les métadonnées générées par le plugin Gradle maven-publish lors de la publication d'une bibliothèque multiplateforme pour Android incluaient l'attribut de type de build pour chaque variante Android publiée. Cela le rendait compatible uniquement avec le même type de build que celui de l'utilisateur de la bibliothèque.
Kotlin/JVM
Avec Kotlin 1.5.30, Kotlin/JVM obtient les mises à jour suivantes :
- Configuration améliorée de la prise en charge des annotations de nullabilité. Vous pouvez spécifier si le compilateur signale une incompatibilité de nullabilité en fonction des informations de types spécifiques d'annotations de nullabilité.
- Instanciation de classes d'annotations. Si vous activez cette fonctionnalité, vous pouvez appeler des constructeurs de classes d'annotation dans du code arbitraire pour obtenir une instance résultante. Cette fonctionnalité couvre les mêmes cas d'utilisation que la convention Java, qui permet la mise en œuvre d'une interface d'annotation.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | annotation class InfoMarker(val info: String) fun processInfo(marker: InfoMarker) = ... fun main(args: Array<String>) { if (args.size != 0) processInfo(getAnnotationReflective(args)) else processInfo(InfoMarker("default")) } |
Kotlin/Native
Kotlin 1.5.30 fournit les améliorations suivantes pour Kotlin/Native :
- Prise en charge native d'Apple Silicon. Vous pouvez désormais créer des applications sur du matériel Apple Silicon pour toutes les cibles prises en charge sur les Mac Intel, sans avoir à utiliser l'environnement de traduction Rosetta. Les nouvelles cibles introduites dans la version 1.5.30 – macosArm64, iosSimulatorArm64, watchosSimulatorArm64 et tvosSimulatorArm64 – permettent d'exécuter nativement du code Kotlin sur du matériel Apple Silicon.
- Amélioration de Kotlin DSL pour le plugin Gradle CocoaPods. Kotlin 1.5.30 améliore la configuration de CocoaPods en fournissant un nouveau format DSL pour les frameworks qui est identique à une définition de framework pour les cibles Apple. Vous pouvez définir s'il s'agit d'un type statique ou dynamique, activer l'exportation explicite des dépendances et l'intégration Bitcode, et configurer d'autres options.
- Interopérabilité expérimentale avec Swift 5.5.
- Dépréciation de la liaison aux DLL sans bibliothèques d'importation pour MinGW (Windows). Cette dépréciation est le résultat du passage à l'éditeur de liens LLD, qui offre de meilleures performances et d'autres améliorations.
- Mappage Swift/Objective-C amélioré pour les objets et les objets compagnons. Vous pouvez désormais accéder aux objets et aux objets compagnons d'une manière plus intuitive pour les développeurs iOS natifs, à l'aide des propriétés .shared et .companion.
Kotlin/JS
Kotlin 1.5.30 fournit les améliorations suivantes pour Kotlin/JS :
- Le backend du compilateur JS IR passe en version bêta. Pour simplifier la migration vers le nouveau backend, vous pouvez utiliser le guide de migration et le nouveau plug-in Kotlin/JS Inspection Pack, qui vous guide tout au long du processus d'apport des modifications nécessaires directement dans IntelliJ IDEA.
- Une meilleure expérience de débogage pour les applications avec le backend Kotlin/JS IR, grâce à la génération de carte source JavaScript. Vous pouvez désormais bénéficier de la prise en charge des points d'arrêt, des étapes et des traces de pile lisibles avec des références de source appropriées dans n'importe quel débogueur JavaScript.
Gradle
Kotlin 1.5.30 introduit les fonctionnalités suivantes pour améliorer l'expérience utilisateur du plugin Kotlin Gradle :
- Prise en charge des chaînes d'outils Java. Gradle 6.7 a introduit la prise en charge des chaînes d'outils Java, ce qui facilite la sélection d'un JDK pour la compilation du projet. Déclarez simplement la version dont vous avez besoin dans le script de build et Gradle fait le reste, en la trouvant sur votre machine hôte ou même en la téléchargeant et en l'installant si elle n'est pas encore là. Le plugin Kotlin Gradle prend en charge les chaînes d'outils Java pour les tâches de compilation Kotlin/JVM. Pour les versions Gradle 6.1-6.6, définissez un JDK home avec l'interface UsesKotlinJavaToolchain.
- Des moyens plus faciles de spécifier explicitement les arguments JVM du démon Kotlin. Si rien n'est spécifié pour le démon Kotlin, il hérite des arguments du démon Gradle. Vous pouvez désormais également spécifier des arguments pour une tâche spécifique, ainsi que pour l'extension Kotlin, en une seule ligne dans build.gradle.kts ou gradle.properties.
build.gradle.kts
Code : | Sélectionner tout |
1 2 3 | kotlin { kotlinDaemonJvmArgs = listOf("-Xmx486m", "-Xms256m", "-XX:+UseParallelGC") } |
gradle.properties
Code : | Sélectionner tout |
kotlin.daemon.jvmargs = -Xmx486m -Xms256m -XX:+UseParallelGC
Bibliothèque standard
Kotlin 1.5.30 apporte des améliorations aux API de durée (Duration) et d'expression régulière (Regex) de la bibliothèque standard :
Améliorations de l'API Duration
Comme indiqué dans sa feuille de route des bibliothèques, JetBrains va stabiliser l'API Duration dans Kotlin 1.6.0, ce qui signifie que c'est la dernière chance de l'essayer et de partager vos commentaires sur tout ce que vous aimeriez changer.
Kotlin 1.5.30 fournit un aperçu des améliorations de l'API. La sortie de Duration.toString() est désormais plus lisible. Par exemple, Duration.minutes(920).toString() produit 15h 20m au lieu de 920m précédemment.
Une durée négative est désormais préfixée d'un signe moins (-), et elle est entourée de parenthèses si elle est constituée de plusieurs composantes : -12m et -(1h 30m).
Cette version fournit également un aperçu des nouvelles fonctions de conversion en durée à partir de chaînes.
Code : | Sélectionner tout |
1 2 3 4 5 | val isoFormatString = "PT1H30M" val defaultFormatString = "1h 30m" println(Duration.parse(isoFormatString)) // "1h 30m" println(Duration.parse(defaultFormatString)) // "1h 30m" |
Améliorations de l'API Regex
Kotlin 1.5.30 fournit de nouvelles fonctions expérimentales pour les expressions régulières :
- matchesAt() vérifie si une expression régulière a une correspondance dans la position spécifiée d'une chaîne.
- matchAt() renvoie la correspondance si elle est trouvée.
Code : | Sélectionner tout |
1 2 3 4 5 | val releaseText = "Kotlin 1.5.30 is released!" val versionRegex = "\\d[.]\\d[.]\\d+".toRegex() println(versionRegex.matchAt(releaseText, 0)) // "null" println(versionRegex.matchAt(releaseText, 7)?.value) // "1.5.30" |
- splitToSequence() est une contrepartie paresseuse de split(). Il divise la chaîne autour des correspondances de l'expression régulière donnée, mais renvoie le résultat sous forme de séquence. Une fonction similaire a également été ajoutée à CharSequence.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 | val colorsText = "green, red , brown&blue, orange, pink&green" val regex = "[,\\s]+".toRegex() val mixedColor = regex.splitToSequence(colorsText) .onEach { println(it) } .firstOrNull { it.contains('&') } println(mixedColor) // "brown&blue" |
Comment installer Kotlin 1.5.30
Si vous utilisez IntelliJ IDEA ou Android Studio, votre EDI vous donnera la possibilité de passer automatiquement à la nouvelle version de Kotlin dès qu'elle sera disponible. Vous pouvez toujours télécharger les dernières versions de ces EDI pour obtenir une prise en charge étendue de Kotlin :
- IntelliJ IDEA pour développer des applications Kotlin pour différentes plateformes.
- Android Studio pour le développement d'applications mobiles Android et multiplateformes.
Assurez-vous d'avoir également mis à jour les bibliothèques kotlinx vers des versions compatibles et spécifié la version 1.5.30 de Kotlin dans les scripts de construction de vos projets existants.
Si vous avez besoin du compilateur en ligne de commande, vous pouvez le télécharger à partir de la page de Github de Kotlin.
Nouveautés dans Kotlin 1.5.30