Quoi de neuf dans Kotlin 1.6 ?

0
141
Trismegist san/Shutterstock.com

Kotlin 1.6 est sorti avec de nouvelles fonctionnalités, un gestionnaire de mémoire expérimental amélioré et une bibliothèque standard améliorée. Les ajouts aident JetBrains à maturité’ langage multiplateforme et interdisciplinaire de plus en plus populaire.

Nouveau gestionnaire de mémoire natif

Le plus grand changement pour l'écosystème Kotlin est sans doute le arrivée du nouveau gestionnaire de mémoire pour Kotlin Native. Bien qu'il soit toujours étiqueté comme un aperçu du développeur, le gestionnaire mis à jour est représentatif de la direction que prendra Kotlin à l'avenir.

La conception révisée est mieux équipée pour gérer les différents backends de compilation utilisés pour transformer Kotlin en code de plate-forme natif pour iOS et Android. Parfois, les plates-formes nécessitent des optimisations différentes pour une opération spécifique. L'approche actuelle impose des limitations sur la concurrence et peut créer des fuites de mémoire sans une attention particulière du développeur.

Le gestionnaire de mémoire de nouvelle génération résout ces lacunes. Il offre des primitives sans fuite pour les opérations simultanées qui peuvent être utilisées en l'état en toute sécurité. Les modifications apportent également une plus grande parité à la gestion de la mémoire native avec le gestionnaire de mémoire existant pour le développement JVM.

Bien que le nouveau système soit disponible dans Kotlin 1.6, il n'est actuellement pas destiné à une utilisation en production. Dans certaines situations, les performances peuvent être réduites jusqu'à 5 fois par rapport au gestionnaire de mémoire hérité. Les efforts de développement sont en cours sur une version performante prête pour une utilisation générale.

Instructions quand scellées

Les instructions Sealed when vous permettent de recevoir un avertissement du compilateur lorsque vous oubliez de gérer un cas possible. Si vous passez une classe scellée, un type booléen ou une énumération dans un quand, vous voudrez normalement prendre une action explicite pour chaque valeur d'entrée possible :

Classe scellée Transmission { classe de données Electric(val Power: Int) : Transmission() classe de données Diesel(val Power: Int) : Transmission() classe de données Hybrid(val Diesel : Transmission, val Électrique : Transmission) : Transmission() }   amusant getTotalPowerKwh(entraînement : DriveTrain) : Int { lorsque (transmission) { est Drivetrain.Diesel -> drivetrain.Diesel.Power est Drivetrain.Electric -> transmission.Puissance.électrique } } Publicité

Dans l'exemple ci-dessus, la classe scellée Drivetrain contient trois classes de données. L'instruction when n'en gère que deux – si votre code reçoit une transmission hybride, une valeur incorrecte sera renvoyée.

Le compilateur Kotlin va maintenant vous alerter de ce problème. Dans Kotlin 1.7, ne pas couvrir toutes les possibilités de manière exhaustive entraînera une erreur de compilation.

Suspendre les transformations de type

Les transformations des types réguliers en types suspendus ont été stabilisé via des conversions automatiques du compilateur. Le compilateur créera la conversion automatiquement lorsque vous passerez une expression de type régulier dans un contexte où un type suspendu est attendu.

Cela active un code comme celui-ci :

fun createUser(nom : chaîne) { //… }   flow.collect(::createUser)   val createUserFunction = ::createUser flow.collect(createUserFunction)

Ce code s'interrompait lors du deuxième appel de flow.collect(). La variable createUserFunction fait référence à la définition de fonction normale, et non à la suspension créée par le premier appel. Kotlin va maintenant gérer cela en créant une version suspendue lorsque le contexte de réception l'exige.

Les fonctions de suspension sont désormais également prises en charge en tant que supertypes. Cela vous permet de transmettre des classes qui implémentent des types fonctionnels de suspension partout où une référence de fonction de suspension est actuellement prise en charge.

class ImplementsSuspendingFunctionalType : suspend () -> Unité { outrepasser suspendre fun invoquer() { /* … */} } Publicité

La suspension () -> L'interface d'unité est implémentée de la même manière que vous pouvez déjà utiliser () -> Unité pour les types sans suspension.

Code Coverage Scanner

Kotlin dispose désormais d'un outil officiel d'analyse de couverture de code. Kover est un plugin Gradle qui collecte les statistiques de couverture des tests pour les projets Kotlin JVM, multiplateformes et Java mixtes. Il peut générer des rapports aux formats HTML et XML.

Kover offre une compatibilité totale avec le langage Kotlin et sa chaîne d'outils Gradle. Bien que certains outils tiers puissent déjà fournir des scores de couverture, ils existent en dehors de l'écosystème et n'ont pas toujours une visibilité sur chaque tâche. Kover propose une approche totalement intégrée. Le développement est en cours avec cette version initiale étiquetée comme expérimentale.

Pour activer Kover, ajoutez les lignes suivantes à votre fichier de construction de niveau supérieur :

plugins { id(“org.jetbrains.kotlinx.kover “) version “0.4.2” }

Kover s'exécutera désormais dans le cadre de vos builds Gradle.

Ajouts de bibliothèque standard

Là sont quelques changements notables à la bibliothèque standard, y compris la promotion de plusieurs fonctions bêta vers stable :

readln() et readlnOrNull()

Ces deux nouvelles fonctions lisent et renvoient une ligne du flux d'entrée standard. Le premier lancera si la marque EOF a été atteinte alors que le second renvoie null.

typeOf()

La fonction typeOf() vous permet de déterminer le type réel d'un type réifié, généralement exprimé par T, au moment de l'exécution.

fun en ligne <réifié T> getTypeString() : chaîne { val type = typeOf<T>() type de retour.toString() }

Générateurs de collections

Les nouvelles fonctions de création vous permettent de créer facilement des collections à partir d'un ensemble de valeurs différentes. Vous pouvez combiner des cartes, des listes et des ensembles dans de nouvelles collections à l'aide de fonctions de première classe :

val fruits = listOf("pomme", "banane"); val veg = listOf("carotte", "chou");   val épicerie = buildList { ajouter ""lait") addAll(fruits) addAll(veg) }   //["lait", "pomme", "banane", "carotte", "chou"]

Valeurs de durée

La classe de durée pour représenter les valeurs temporelles a été promu à stable. Il fournit un type intégré pour stocker une durée de période dans votre code. La classe a des méthodes qui facilitent les conversions entre les unités :

//Émet 1.0 println(60.toDuration(DurationUnit.SECONDS).inMinutes);

Plus de changements de bibliothèque standard

Les entiers ont de nouvelles fonctions rotateLeft() et rotateRight(). Ceux-ci font tourner la représentation binaire du nombre d'un nombre spécifié de bits dans les directions indiquées. Les expressions régulières obtiennent des fonctions de division de séquence et un comportement cohérent pour replace() et replaceFirst() dans les environnements Java et JavaScript.

Certaines fonctions existantes ont été dépréciées. Les fonctions concat(), match() et matches() sur les chaînes, ainsi que la fonction sort() sur les tableaux, émettront désormais des avertissements. Leur fonctionnalité est déjà couverte par des options alternatives.

Autres changements

Kotlin 1.6 ajoute quelques améliorations de l'écosystème et de la qualité de vie. Parmi ceux-ci se trouve la prise en charge de Xcode 13 et la possibilité de compiler des versions Windows sur n'importe quelle plate-forme. Si vous ciblez mingwX64 ou mingwX86 pour Windows, vous pouvez désormais compiler à partir de n'importe quel système prenant en charge le développement Kotlin/Native.

Publicité

Les améliorations apportées aux caches du compilateur pour les versions Linux et iOS ont réduit de moitié les temps de construction typiques après la première exécution. Les mises à jour de la chaîne de dépendances Kotlin réduisent considérablement l'utilisation du disque. Le passage à LLVM 11.1 a réduit la version macOS de 1200 Mo à environ 300 Mo.

Si vous utilisez Kotlin JavaScript, vous pouvez désormais désactiver les téléchargements automatiques de Node.js et Yarn pendant le processus de construction . Ceci est utile lorsque vous compilez du code dans un environnement préconfiguré où l'hôte a déjà ces dépendances installées.

Résumé

Kotlin 1.6 est une version saine avec de nouvelles fonctionnalités expérimentales ouvrant la voie à suivre et une bonne liste de changements de langage et de bibliothèque standard que vous pouvez utiliser aujourd'hui. Des améliorations ont également été apportées à l'interopérabilité entre les versions de Kotlin, de sorte que davantage de code se comportera de la même manière, qu'il soit compilé pour JVM, Native ou JavaScript.

Le jalon 1.6 voit également les mainteneurs de Kotlin offrent une période de support prolongée pour les anciennes versions d'API. Trois versions précédentes seront désormais prises en charge sur une cadence de roulement. Cela signifie que vous pouvez actuellement choisir de développer contre les versions de Kotlin 1.3 à 1.6, ce qui vous donne plus de temps pour mettre à niveau entre les versions.

Vous pouvez passer à Kotlin 1.6 aujourd'hui en mettant à jour votre version d'IntelliJ IDEA, Android Studio, Xcode , ou le compilateur Kotlin CLI. Cela vaut la peine de consulter d'abord le guide de compatibilité pour vous assurer que vous avez résolu toutes les dépréciations signalées précédemment qui généreront des avertissements ou des erreurs dans la version 1.6.