Kotlin - Guide pratique

Ken Kousen

Kotlin - Guide pratique

Traduction française publiée et vendue avec l’autorisation de O’Reilly Media, Inc. de Kotlin Cookbook ISBN 9781492046677 © 2020 Ken Kousen.

© 2020 Éditions First, un département d’Édi8

92, avenue de France

75013 Paris – France

Tél. : 01 44 16 09 00

Fax : 01 44 16 09 01

Courriel : firstinfo@editionsfirst.fr

Site Internet : www.editionsfirst.fr

ISBN : 978-2-412-05328-7

ISBN numérique : 9782412060940

Dépôt légal : juin 2020

Traduction de l’anglais : Olivier Engler

Mise en page : Pierre Brandeis

Cette œuvre est protégée par le droit d’auteur et strictement réservée à l’usage privé du client. Toute reproduction ou diffusion au profit de tiers, à titre gratuit ou onéreux, de tout ou partie de cette œuvre est strictement interdite et constitue une contrefaçon prévue par les articles L 335-2 et suivants du Code de la propriété intellectuelle. L’éditeur se réserve le droit de poursuivre toute atteinte à ses droits de propriété intellectuelle devant les juridictions civiles ou pénales.

Ce livre numérique a été converti initialement au format EPUB par Isako www.isako.com à partir de l'édition papier du même ouvrage.

Avant-propos

Il est devenu coutumier de voir surgir de temps à autre un nouveau langage de programmation prétendant révolutionner la manière de produire des applications informatiques. L’excitation retombe normalement au bout de quelques mois ; il en va différemment pour le langage Kotlin. Apparu en 2011, il s’est frayé un chemin, sans coup férir, dans de plus en plus de projets dans diverses régions du monde. Les développeurs habitués à Java qui en connaissaient les lacunes ont ajouté toujours un peu plus de bribes de code Kotlin par-ci, par-là dans leurs projets en Java. Finalement, le volume de code de leurs projets diminuait pendant que leur puissance d’expression augmentait.

Depuis, Kotlin s’est imposé comme le langage préféré pour créer des applications Android. Il a atteint un niveau de maturité suffisant pour qu’un livre tel que celui-ci devienne vraiment désirable. Regorgeant d’astuces pratiques, il débute néanmoins avec les fondamentaux. Ken montre comment installer Kotlin, le configurer en fonction de vos projets puis comment l’utiliser avec Java, dans un navigateur ou de façon autonome. Mais le livre entre ensuite vite dans le vif du sujet en donnant des réponses aux problèmes de programmation qui se posent jour après jour aux développeurs et concepteurs de systèmes.

Même si un chapitre entier est dédié aux tests Kotlin, le livre est en fait entièrement orienté selon une approche de pilotage par les tests. Ces tests servent d’exemples pour utiliser le langage et vous aident à adapter les recettes à vos besoins exacts.

Le livre vous apporte une aide claire et directe pour vous épauler dans votre progression vers la maîtrise de Kotlin. C’est un guide pratique essentiel que chaque développeur Kotlin devrait garder en permanence à portée de main, ou de souris.

Dawn et David Griffiths

Auteurs de Head First Kotlin

Octobre 2019

Introduction

Bienvenue dans ce livre consacré à Kotlin ! L’objectif majeur n’est pas de vous apprendre à maîtriser la syntaxe et la sémantique du langage, mais plutôt de montrer quand et pourquoi utiliser ses caractéristiques fonctionnelles. Il n’est pas question de passer en revue de façon exhaustive les contenus des librairies de fonctions. Cela dit, une série de recettes visant quelques fondamentaux a été ajoutée pour faciliter l’accès au reste du livre pour ceux des lecteurs qui n’auraient pas encore une grande intimité avec le langage Kotlin.

La société JetBrains éditrice de l’atelier IntelliJ, invite la communauté des programmeurs Kotlin à s’engager dans trois domaines de développement en particulier : le multiplateforme, le natif et JavaScript. Les auteurs de ce livre ont choisi de ne pas ajouter de recettes abordant ces trois domaines, parce qu’ils n’ont soit pas encore atteint une maturité technique acceptable, soit ne concernent qu’un faible pourcentage de programmeurs. C’est pourquoi le livre est concentré sur l’utilisation de Kotlin en relation avec la JVM de Java.

Le référentiel GitHub du code source de tous les exemples se trouve à l’adresse https://github.com/kousen/kotlin-cookbook. Le fichier Wrapper Gradle est fourni (sans oublier le fichier de construction écrit en langage DSL Kotlin) et tous les tests réussissent.

Les exemples ont été compilés et testés avec les deux versions à long support LTS (Long Term Support) de Java, Java 8 et Java 11. En termes techniques, Java 8 est devenu obsolète, mais il est encore tellement utilisé qu’il a été jugé sensé de vérifier que les exemples lui restent compatibles. Au moment d’écrire ceci, la version actuelle de Kotlin est la 1.3.72 ; la 1.4 étant la prochaine. Le code source des exemples convient à toutes les versions plus récentes connues à ce jour. Le référentiel GitHub mérite une visite de votre part après apparition d’une nouvelle version majeure de Kotlin, car des mises à jour y seront postées si nécessaire.

À qui s’adresse ce livre

Ce livre s’adresse d’abord aux programmeurs qui ont déjà un minimum d’expérience en programmation orientée objet, notamment en Java ou dans un langage s’appuyant sur la machine virtuelle JVM. Une certaine connaissance de Java est bienvenue, sans être indispensable.

Ce livre n’est pas une présentation détaillée du langage, mais un livre de recettes, c’est-à-dire de techniques de bonne utilisation du langage Kotlin. Toute la puissance du langage peut de ce fait être sollicitée dans chaque recette si nécessaire. Les fondamentaux de Kotlin ne sont que rappelés à l’occasion. Chaque chapitre rappelle néanmoins quelques principes qui vous aideront si vous n’êtes pas encore intime avec certains concepts comme les collections, les tableaux ou la création de classes. La documentation de référence en ligne (https://kotlinlang.org/docs/reference) constitue une introduction complète au langage ; ce livre y fait référence, notamment à ses exemples.

Cet ouvrage entre de temps à autre dans les détails d’implémentation des éléments des librairies de Kotlin. Vous pourrez ainsi mieux comprendre comment les créateurs du langage exploitent ces librairies et quels choix de conception les sous-tendent. Aucune connaissance en ce domaine n’est requise, et vous pouvez même passer rapidement les paragraphes concernés si vous-même ne l’êtes pas.

Structure du livre

Le livre est structuré sous forme de séries de courtes recettes indépendantes, même si quelques renvois de l’une à l’autre ont été prévus. Vous pouvez les assimiler par accès direct en les sélectionnant d’après leur titre dans la table des matières. Cela dit, les recettes sont regroupées par domaines dans treize chapitres :

• Chapitre 1 : couvre les procédures d’installation et d’exécution de Kotlin, l’interpréteur REPL, les outils de construction Maven et Gradle et le générateur d’image native de GraalVM.

• Chapitre 2 : rappelle quelques fondamentaux de Kotlin (type nullables, surcharge d’opérateurs, transtypages sûrs) puis quelques techniques pointues comme les opérations de décalage au niveau bits et la fonction d’extension to pour la classe Pair.

• Chapitre 3 : détaille quelques caractéristiques de l’orientation objet du langage que les habitués d’autres langages peuvent trouver particulières voire déroutantes : le mot-clé const, les propriétés de soutien (backing), l’initialisation retardée (lazy) et l’étonnante classe Nothing qui va perturber plus d’un programmeur Java.

• Chapitre 4 : ce bref chapitre réunit quelques recettes à propos de la programmation fonctionnelle. Les concepts fonctionnels sont abordés un peu partout dans le reste du livre, selon les besoins, et notamment au sujet des collections, séquences et coroutines, mais certaines techniques moins répandues méritent une discussion plus spécifique.

• Chapitre 5 : sont ici abordés les tableaux et collections, en particulier les techniques moins évidentes pour la destruction d’une collection, le tri selon plusieurs propriétés, la création d’une fenêtre d’accès à une collection et la création d’une progression.

• Chapitre 6 : nous voyons ici comment Kotlin traite de façon écourtée (lazy) les séquences d’éléments, sur le même modèle que les flux (streams) de Java. Les recettes abordent la génération de séquences, la récolte yielding et la gestion des séquences infinies.

• Chapitre 7 : couvre un autre thème unique à Kotlin : les fonctions intimes (scope functions) qui servent à exécuter un bloc de code dans le contexte d’un objet. Ces fonctions telles que let, apply et also s’avèrent fort utiles et ce chapitre explique pourquoi et comment les utiliser.

• Chapitre 8 : aborde le concept de délégation qui permet d’utiliser la composition à la place de l’héritage. Kotlin définit plusieurs déléguées dans la librairie standard, et notamment lazy, observable et vetoable.

• Chapitre 9 : les tests forment le sujet unique de ce chapitre, en particulier l’outil Junit 5. Dans cette version, JUnit se combine bien à Kotlin, tant en utilisation classique que pour les applications fondées sur le châssis Spring Framework. Plusieurs approches sont proposées pour simplifier l’écriture et l’exécution des tests.

• Chapitre 10 : réunit des recettes relatives à la gestion des ressources et notamment les entrées/sorties fichiers et la fonction très polyvalente use.

• Chapitre 11 : sont regroupées ici diverses recettes n’ayant pas trouvé place dans un des autres chapitres : obtention du numéro de version de Kotlin, forçage de when à être exhaustive même lorsqu’elle ne renvoie pas de valeur ou encore utilisation de la fonction replace avec des expressions régulières. Sont aussi présentées la fonction d’attente TODO, la classe Random et la bonne intégration avec le mécanisme de gestion d’exceptions de Java.

• Chapitre 12 : s’intéresse à Spring Framework avec Spring Boot, que Kotlin supporte bien. Plusieurs recettes montrent comment utiliser des classes Kotlin en tant que beans gérés, comment mettre en place une persistance JPA et comment injecter des dépendances si besoin est.

• Chapitre 13 : nous terminons avec l’une des caractéristiques les plus populaires de Kotlin : les coroutines. Elles constituent la base de la programmation concurrente et de traitement en parallèle du langage. Les principes sont rappelés (builders et dispatchers), ainsi que l’annulation et le débogage des coroutines et la technique pour les exécuter dans un bassin d’exétrons (thread pool) Java spécifique.

Remarque à l’adresse des développeurs Android

Kotlin a été désigné langage de développement de préférence pour Android. Pour autant, c’est aussi un langage à usage général non limité à cet environnement. Dans tous les domaines dans lesquels vous auriez utilisé Java, vous pouvez utiliser Kotlin, et pas seulement.

Même si ce livre ne comporte pas de section dédiée aux spécificités d’Android, des détails d’usage de Kotlin pour Android sont fournis aux moments appropriés. Par exemple, l’annulation de coroutines, typique d’Android, tire avantage de l’énorme usage de Kotlin dans les librairies Android. Pour l’essentiel, les techniques présentées dans le livre visent une utilisation généraliste du langage. Nous espérons que les développeurs Android sauront se les approprier avec profit dans les projets les plus divers.

Conventions typographiques

Pour rendre plus aisée l’exploitation du contenu du livre, nous avons pris soin de mettre en valeur certains termes par un codage visuel à portée sémantique, lorsqu’ils apparaissent dans le corps du texte :

NomMotClé

Nous imprimons ainsi toutes les entités fondamentales définies par le langage : noms des types, attributs, paramètres, méthodes et fonctions.

NomVariable

Noms des variables et des objets choisis par le développeur.

Librairies et menus

Noms de librairies, de commandes et d’options de menus.

NomFichier

Noms de fichiers, de répertoires (dossiers) et de modules enfichables (plug-in).

Lien

Adresses Web et FTP.

Concept

Mise en valeur de la première apparition d’un terme essentiel.

Cette icône marque un paragraphe contenant une astuce ou une précision.

Cette icône marque une précision technique.

Cette icône marque une mise en garde ou bien souligne un concept pouvant être à l’origine d’une équivoque.

Cette icône marque une précision spécifique à la version française qui a été ajoutée par le traducteur.

Fichiers source des exemples

Il est probable que les exemples bénéficient de retouches après la sortie de la version française. N’hésitez donc pas à vous rendre d’abord sur la page de référence anglaise des exemples pour y récupérer la plus récente version :

https://github.com/kousen/kotlin-cookbook

Cliquez à droite le bouton Clone or download et choisissez Download ZIP.

Le code source du livre est à votre disposition ; vous pouvez l’incorporer à vos projets sans autorisation préalable. En revanche, vous ne pouvez pas citer in extenso ce code source dans un document papier ou numérique (DVD, PDF, etc.) sans avoir obtenu notre accord au préalable.

Si vous désirez sourcer une citation du code par exemple dans le cadre d’une formation, voici la formule à ajouter :

"Kotlin Cookbook by Ken Kousen (O’Reilly). (C) 2020 Ken Kousen, 978-1-492-04667-7."

Seuls quelques exemples sont francisés pour plus de confort lors de la première lecture. Les fonctions de test portent des noms spéciaux avec espaces dans des chaînes délimitées par des apostrophes inverses penchées à gauche `, que nous appelons aposgau (backticks). Nous ne fournissons pas les fichiers sources francisés, car la version anglaise convient parfaitement.

Pour chaque chapitre, tous les codes source des exemples sont également disponibles dans une archive au format ZIP que nous vous invitons à télécharger depuis la page dédiée au livre sur le site de l’éditeur de cette version française :

www.editionsfirst.fr

Recherchez le titre du livre grâce à la zone de recherche, puis dans la fiche du livre, cliquez sur Contenu additionnel, et enfin sur Télécharger.

N’hésitez pas à consulter l’éventuel fichier LISEZMOI.txt que vous trouverez à côté de l’archive des exemples si des remarques complémentaires ou des points de mise à jour rendent l’existence de ce fichier justifiée.

À propos de l’auteur

Ken Kousen est Java Champion, Oracle Developer Champion, formateur Grails Rock Star et JetBrains Certified Kotlin Training Partner. Il est l’auteur de livres abordant le Java moderne, des recettes Gradle pour Android et Groovy pour Java.

Cette adaptation est réalisée peu de mois après celle d’une somme dédiée au langage Rust. Les deux langages Kotlin et Rust constituent clairement deux univers de programmation modernes des plus intéressants dans la décennie 2020.

Colophon : le kinkajou

L’animal montré en couverture est un kinkajou (Potos flavus). C’est un petit mammifère nocturne à longue queue, endémique en Amérique centrale et du Sud.

L’atypique kinkajou possède une fourrure brun-or, de petites pattes et de grands yeux noirs, ces derniers étant indispensables à cette créature vivant la nuit. Ses pattes arrière à pouce opposable et sa queue préhensile lui assurent de belles acrobaties dans les cimes des arbres qu’il affectionne. Bien qu’il s’approche des primates en apparence et en comportement, le kinkajou a évolué de façon séparée et s’apparente plus au raton laveur.

Bien qu’il soit omnivore, le kinkajou se nourrit surtout de fruits, notamment de figues, quitte à faire de temps à autre bombance de petits vertébrés ou d’œufs d’oiseaux. Sa langue étonnamment longue lui permet d’aller puiser des insectes et du nectar, ce qui explique son surnom d’ours à miel. D’ailleurs, élevé en captivité, il est nourri essentiellement avec du miel, et il s’en délecte.

Les kinkajous se regroupent pour la toilette mutuelle et la reproduction. S’ils sont dérangés ou réveillés en plein jour, ils peuvent se montrer agressifs et attaquent avec leurs dents et leurs griffes acérées, ou lancent des cris stridents et des sifflements qui portent loin dans la canopée.

Son statut de conservation est Préoccupation Mineure (LC, Least Concern), mais la déforestation peut mettre la population en péril. C’est une tradition aux éditions O’Reilly de présenter des animaux en danger de disparition sur ses couvertures ; tous sont importants pour la planète.

L’illustration est de Karen Montgomery, qui s’est inspirée d’une gravure monochrome du Lydekker’s Natural History.

Remerciements de l’auteur

Lors de la conférence Google I/O de 2017, la société Google a annoncé que Kotlin sera dorénavant supporté pour le développement sous Android. La même année, la société Gradle, Inc., qui a conçu l’outil de construction logicielle Gradle, a annoncé qu’elle supporterait un langage dédié de domaine pour Gradle (DSL) pour les constructions. Ces deux décisions m’ont convaincu de plonger dans Kotlin, et je suis bienheureux d’avoir agi ainsi.

J’ai pu, au cours des dernières années, assurer régulièrement des présentations et des ateliers Kotlin. Alors que les principes généraux en sont faciles à acquérir, j’ai été étonné de constater la profondeur de ce langage et son excellente prise en charge des techniques de développement modernes que proposent d’autres langages tels que Groovy ou Scala. Kotlin constitue une synthèse des meilleurs concepts de programmation en vigueur et j’ai appris beaucoup en descendant dans les détails comme il a fallu le faire pour produire ce livre.

Dans mon parcours d’apprentissage, j’ai tiré profit de mes interactions avec de nombreux développeurs Kotlin, et notamment Dawn et Dave Griffiths, dont les deux livres de la collection Tête la première (Head First Android Development et Head First Kotlin) sont superbes ; ils ont d’ailleurs accepté d’écrire l’avant-propos de ce livre. Hadi Hariri est un ardent promoteur du langage chez JetBrains ; il effectue souvent des présentations de Kotlin et celles-ci m’ont motivé à consacrer encore plus de temps au langage. Il m’a fait l’honneur d’effectuer une relecture technique, ce dont je lui suis reconnaissant.

Bill Fly a aussi fourni une relecture technique. J’ai souvent interagi avec lui sur la plate-forme O’Reilly Learning Platform, et il m’a toujours fourni des remarques intéressantes (et posé des questions coriaces). Mon bon ami Jim Harmon m’avait aidé à démarrer dans l’univers Android voici quelques années, et a continué à répondre à mes questions et à m’éclairer sur la mise en pratique de Kotlin. Mark Maynard est un développeur du monde de l’industrie qui m’a guidé sur l’exploitation de Kotlin avec le châssis Spring Framework, et je l’en remercie. Enfin, l’inimitable Venkat Subramaniam a pris sur son temps alors qu’il avait lui-même un livre en gestation sur Kotlin, Programming Kotlin (du même niveau d’excellence que ses précédents). Je suis comblé d’avoir tous ces réviseurs techniques autour de moi et je reste humble devant le volume de temps et d’efforts qu’ils ont consacré au livre que vous tenez entre les mains.

Je veux saluer mes nombreux collègues orateurs de la tournée NFJS, notamment Nate Schutta, Michael Carducci, Matt Stine, Brian Sletten, Mark Richards, Pratik Patel, Neal Ford, Craig Walls, Raju Gandhi, Jonathan Johnson et Dan « the Man » Hinojosa pour partager sans relâche leurs conseils et leurs encouragements. Je suis sûr d’en avoir oublié.

Créer des livres et préparer des formations sont des activités solitaires, et ce sont les miennes actuellement. Il est bon de pouvoir s’appuyer sur un groupe d’amis et de collègues vous donnant leurs points de vue, leurs avis et toutes sortes de divertissements.

De nombreuses personnes de la maison d’édition O’Reilly Media ont participé à la création du livre. Je ne vais pas les citer un à un, mais je veux mentionner Zan McQuade, qui a plusieurs fois été placé en situation délicate en raison de mon planning chaotique et de ma tendance à contredire par principe. Merci pour ta patience, ta compréhension et le boulot déployé pour amener le livre au bout de son chemin de parution.

Je tiens enfin à remercier mon épouse Ginger, et mon fils Xander. Je ne serais pas tel que je suis sans le soutien et la gentillesse de ma famille, et chaque jour je m’en rends encore mieux compte. Je ne peux pas vous dire à quel point vous comptez pour moi.

Terminologie française

La terminologie mérite un soin particulier. Voici nos principales décisions.

Terme utilisé
Terme anglais
Commentaires si nécessaire

aposgau

backtick

De « apostrophe penchée vers la gauche ». Nous aurions pu choisir aposarr pour « apostrophe arrière ».

autocâblage

autowiring

bassin d’exétrons

thread pool

chargement optimisé

lazy loading

châssis

framework

Enfin un terme français plus convenable (et même plus court que l’anglais) que ce « infrastructure » fatigant à saisir.

délégante (fonction)

delegation

déléguée (fonction)

delegate

distributeur

dispatcher

emballé (dans surtype)

boxed

Int est le surtype de int.

enfichable

plug-in

évaluation écourtée

lazy evaluation

Parfois aussi « fugace ».

exception gérée

checked exception

exétron

thread

Utilisé depuis 2005 sous Linux (cf. https://fr.wiktionary.org/wiki/ex%C3%A9tron).

fonction d’aide

helper function

fonction intime

scope function

Plus précis que fonction de portée. L’anglais est un peu cavalier. La fonction a accès aux « tripes » de l’objet.

fonction/champ de soutien

backup function/ backing field

Surtout pas du mot à mot qui donnerait « sauvegarde ».

immutable

immutable

Le français connaît le terme immuable (sans t), mais nous choisissons d’apparier mutable à immutable (digne d’un notaire).

librairie

library

Depuis plusieurs années, la traduction par bibliothèque perd du terrain au profit de librairie.

mappe

map

Le terme anglais vient du français que l’on retrouve dans mappemonde.

méthode fabrique

factory method

nommée (fonction)

called

Nous évitons l’ambiguïté souvent rencontrée en anglais pour le terme called, entre une fonction (ou méthode) nommée maFonc et la même fonction

appelée pendant l’exécution (CALL, branchement du code exécutable avec gestion de la pile d’appels).

octocode

bytecode

Peu d’auteurs et de traducteurs français ont tenté de trouver un terme traduisant le concept de bytecode. Ce langage intermédiaire est essentiellement fondé sur des codes sur un octet, donc sur 8 bits, d’où octo.

paramètre

argument

Un vieux débat divise les tenants de paramètre et ceux qui préfèrent argument. Nous n’utilisons que le terme paramètre. Si plus de précision est demandée, l’argument est le nom « théorique » fourni dans la déclaration ou la signature, alors que le paramètre est réel, lors des appels.

récolter

yield

valeur neutre/identité

identity value

zélé

eager