Kotlin 1.6

Par:
fredericmazue

jeu, 18/11/2021 - 15:29

JetBrains a publié la version 1.6 de son langage Kotin. Parmi les nouveautés de cette riche version, mentionnons tout d'abord le fait que l'amélioration de l'inférence des types récursifs génériques, apparue avec Kotlin 1.5.30 est maintenant activée par défaut.

Cette amélioration permet d'inférer les arguments des types gécursifs génériques en se basant uniquement sur les limites supérieures des paramètres de type correspondants. 

// Before 1.5.30
val containerA = PostgreSQLContainer<Nothing>(DockerImageName.parse("postgres:13-alpine")).apply {
  withDatabaseName("db")
  withUsername("user")
  withPassword("password")
  withInitScript("sql/schema.sql")
}

// With compiler option in 1.5.30 or by default starting with 1.6.0
val containerB = PostgreSQLContainer(DockerImageName.parse("postgres:13-alpine"))
  .withDatabaseName("db")
  .withUsername("user")
  .withPassword("password")
  .withInitScript("sql/schema.sql")

A remarquer aussi du nouveau autour des déclarations when. Une déclaration when est exhaustive lorsqu'elle contient des branches pour tous les types ou valeurs possibles de son sujet, et, pour certains types, une branche else supplémentaire. Une déclaration exhaustive, comme le terme le suggère, couvre tous les cas possibles, rendant votre code plus sûr.

JetBrains interdira bientôt les déclarations when non exhaustives pour rendre le comportement cohérent avec les expressions when. Pour assurer une migration en douceur, Kotlin 1.6.0 signale des avertissements concernant les déclarations when non exhaustives avec un sujet enum, sealed ou boolean. Ces avertissements deviendront des erreurs dans les versions futures.

sealed class Contact {
    data class PhoneCall(val number: String) : Contact()
    data class TextMessage(val number: String) : Contact()
}

fun Contact.messageCost(): Int =
    when(this) { // Error: 'when' expression must be exhaustive
        is Contact.PhoneCall -> 42
    }

fun
sendMessage(contact: Contact, message: String) {
    // Starting with 1.6.0

    // Warning: Non exhaustive 'when' statements on Boolean will be
    // prohibited in 1.7, add 'false' branch or 'else' branch instead
    when(message.isEmpty()) {
        true -> return
    }

    // Warning: Non exhaustive 'when' statements on sealed class/interface will be
    // prohibited in 1.7, add 'is TextMessage' branch or 'else' branch instead
    when(contact) {
        is Contact.PhoneCall -> TODO()
    }
}

A partir de Kotlin 1.6.0, JetBrains en charge le développement de trois versions précédentes de l'API au lieu de deux, ainsi que la version stable actuelle. Donc JetBrains prend actuellement en charge les versions 1.3, 1.4, 1.5 et 1.6.

Kotlin/Natif

Il y a aussi beaucoup de nouveau du côté de Kotlin/Natif :

  • Un nouveau gestionnaire de mémoire en préversion
  • Prise en charge de Xcode 13
  • Compilation de cibles Windows sur n'importe quel hôte
  • Mises à jour de LLVM et de l'éditeur de liens
  • Amélioration des performances
  • Plugin de compilateur unifié ABI avec backends JVM et JS IR
  • Messages d'erreur détaillés pour les échecs de liaison klib
  • API de gestion des exceptions non gérée retravaillée   

Site : kotlinlang.org