ProgrammationDéveloppeur Android

Comment fonctionnent les arguments par défaut et les paramètres nommés en Kotlin ? Parlez des différences par rapport à Java, des nuances de passage d'arguments, de la compilation avec des méthodes de surcharge, de l'ordre des paramètres nommés et positionnels. Donnez un exemple.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Kotlin prend en charge les valeurs par défaut (default arguments) et les paramètres nommés (named parameters), ce qui offre une plus grande flexibilité par rapport à Java.

Points clés :

  • En Kotlin, les paramètres de fonction peuvent avoir des valeurs par défaut :
    fun greet(name: String = "User", greeting: String = "Hello") { println("$greeting, $name!") }
  • Vous pouvez appeler la fonction en spécifiant seulement les paramètres nécessaires — les autres seront remplis par défaut.
  • Les paramètres nommés permettent de spécifier explicitement le nom de l'argument — particulièrement utile lorsque la fonction a beaucoup de paramètres :
    greet(greeting = "Salut") // -> Salut, User!
  • Il est possible de combiner des paramètres ordinaires (positionnels) et nommés, tant que les nommés ne sont pas utilisés au milieu de l'appel.
  • Contrairement à Java (où une surcharge est effectuée pour chaque combinaison), Kotlin compile les arguments par défaut en méthodes de surcharge uniquement pour l'interopérabilité avec Java, et cela n'est pas visible à l'intérieur de Kotlin.

Nuances :

  • Après avoir utilisé un argument nommé, les arguments suivants doivent également être nommés.
  • Pour utiliser des fonctions avec des paramètres par défaut depuis Java, il peut être nécessaire d'utiliser l'annotation @JvmOverloads.

Question piège.

Peut-on mélanger des arguments positionnels et nommés dans n'importe quel ordre lors de l'appel d'une fonction en Kotlin ?

Réponse correcte : Non, après avoir spécifié au moins un argument nommé, tous les suivants doivent être nommés. Une violation entraînera une erreur de compilation.

// Incorrect greet(greeting = "Salut", "Ivan") // Erreur ! // Correct greet("Ivan", greeting = "Salut") greet(name = "Ivan", greeting = "Salut")

Exemples d'erreurs réelles en raison d'une méconnaissance des subtilités du sujet.


Histoire

L'équipe a intégré un module Kotlin avec un projet Java legacy et a oublié d'ajouter l'annotation @JvmOverloads pour la fonction avec des paramètres par défaut. En conséquence, le code Java ne voyait pas les méthodes de surcharge nécessaires — des erreurs d'exécution se produisaient lors de l'appel.


Histoire

Lors d'un refactoring utilisant des paramètres nommés, le développeur a accidentellement échangé les arguments — lors d'un changement ultérieur des noms des paramètres, cela est passé inaperçu (le typage n'était pas violé, mais la sémantique de l'appel a changé !). Cela a conduit à des bogues étranges dans la logique UI, découverts plus tard.


Histoire

L'un des développeurs, dans une tentative d'améliorer la lisibilité, a mélangé des arguments positionnels et nommés au milieu de l'appel. Le code ne compilait pas, mais l'équipe a eu du mal à comprendre quel était le problème — car ils avaient souvent rencontré cela dans d'autres langages et s'attendaient à un comportement similaire de la part de Kotlin.