
Salut, habrozhiteli! Le livre de Josh Skin et David Greenhall est basé sur le cours populaire Kotlin Essentials de Big Nerd Ranch. Des exemples vivants et utiles, des explications claires des concepts clés et des API fondamentales introduisent non seulement le langage Kotlin, mais enseignent également comment utiliser ses capacités efficacement, et vous permettent également de maîtriser l'environnement de développement JetBrains IntelliJ IDEA.
Peu importe que vous soyez un développeur expérimenté qui veuille aller au-delà de Java ou que vous appreniez le premier langage de programmation. Josh et David vous guideront des principes de base à l'utilisation étendue de Kotlin afin que vous puissiez créer des applications fiables et efficaces.
À qui s'adresse ce livre?
Nous (les auteurs) avons écrit ce livre pour les développeurs de différents calibres: les développeurs Android expérimentés qui manquent de fonctionnalités Java, les développeurs de code serveur intéressés par les fonctionnalités de Kotlin, ainsi que pour les débutants qui décident d'apprendre un langage compilé efficace.
Ce livre peut vous intéresser dans la prise en charge d'Android, mais il ne se limite pas à la programmation sur Kotlin pour Android. De plus, dans ce livre, un seul chapitre - le chapitre 21 - traite des techniques de programmation de Kotlin pour Android. Néanmoins, si vous êtes intéressé par le sujet de l'utilisation de Kotlin pour développer des applications Android, ce livre vous présentera les techniques de base qui simplifieront le processus d'écriture d'applications Android dans Kotlin.
Bien que Kotlin ait été influencé par d'autres langues, vous n'avez pas besoin de savoir comment elles sont conçues pour fonctionner avec succès avec Kotlin. De temps en temps, nous comparerons le code Java et le code Kotlin. Si vous avez de l'expérience en développement en Java, cela vous aidera à comprendre la relation entre les deux langages. Et si vous n'avez pas une telle expérience, des exemples de résolution des mêmes problèmes dans une autre langue vous aideront à comprendre les idées qui ont influencé la formation de Kotlin.
Comment utiliser ce livre
Ce livre n'est pas une référence. Notre objectif est un apprentissage cohérent de la langue Kotlin. Vous travaillerez avec des projets et apprendrez la langue dans le processus. Pour plus d'effet, nous vous recommandons d'essayer tous les exemples de code en lisant le livre. Travailler avec des exemples vous aidera à développer une mémoire «musculaire» et vous fournira des informations qui vous permettront de passer d'un chapitre à un autre.
Chaque chapitre suivant est basé sur le précédent. Nous vous recommandons de ne pas sauter de chapitres. Même si vous avez étudié le sujet en travaillant avec d'autres langues, nous vous suggérons au moins de lire à ce sujet ici: beaucoup de choses sont implémentées différemment dans Kotlin. Nous commencerons par des sujets d'introduction, tels que les variables et les listes, puis passerons aux techniques de programmation orientée objet et fonctionnelle pour vous faire comprendre ce qui fait de Kotlin un outil si puissant. À la fin du livre, vous passerez d'un débutant à un développeur avancé sur Kotlin.
Nous voulons ajouter que vous ne devriez pas vous presser: développez, utilisez la documentation Kotlin sur le lien:
kotlinlang.org/docs/reference , où il y a des réponses à de nombreuses questions qui se posent pendant les expériences.
Extrait. Extensions
Les extensions vous permettent d'ajouter des fonctionnalités à un type sans modifier explicitement la déclaration de type. Utilisez des extensions avec des types personnalisés, ainsi qu'avec des types sur lesquels vous n'avez aucun contrôle, tels que List, String et d'autres types de la bibliothèque standard de Kotlin.
Les extensions sont une alternative à l'héritage. Ils sont bien adaptés pour ajouter des fonctionnalités à un type si la définition de classe n'est pas disponible pour vous ou si la classe n'a pas de modificateur ouvert pour autoriser le sous-classement.
La bibliothèque standard de Kotlin utilise souvent des extensions. Par exemple, les fonctions standard que vous avez apprises au chapitre 9 sont des extensions déclarées, et dans ce chapitre, vous verrez quelques exemples de leur déclaration.
Dans ce chapitre, nous allons d'abord travailler sur un projet Sandbox, puis appliquer ces connaissances pour optimiser le code NyetHack. Pour commencer, ouvrez le projet Sandbox et créez un nouveau fichier appelé Extensions.kt.
Déclaration de fonction d'extension
Votre première extension vous permet d'ajouter n'importe quel degré d'enthousiasme à String. Déclarez-le dans Extensions.kt.
Listing 18.1. Ajout d'une extension pour le type String (Extensions.kt)
fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount)
Les fonctions d'extension sont déclarées de la même manière que les autres fonctions, mais avec une différence: lors de la définition d'une fonction d'extension, vous spécifiez également un type appelé type de réception auquel l'extension ajoute des fonctionnalités. (Rappelons le chapitre 9, où nous avons appelé les types extensibles «récepteurs».) Pour la fonction addEnthusiasm, un type String acceptant est spécifié.
Le corps de la fonction addEnthusiasm n'est qu'une expression qui renvoie une chaîne: le contenu de ceci et 1 ou plusieurs points d'exclamation, selon la valeur de l'argument quantité (1 est la valeur par défaut). Le mot-clé this fait référence à l'instance de l'objet de destination pour laquelle l'extension est appelée (dans ce cas, l'instance String).
Vous pouvez maintenant appeler la fonction addEnthusiasm pour n'importe quelle instance de String. Essayez une nouvelle fonction d'extension en déclarant une ligne dans la fonction principale et en appelant la fonction d'extension addEnthusiasm pour qu'elle affiche le résultat.
Listing 18.2. Appel d'une nouvelle extension pour une instance de l'objet récepteur String (Extensions.kt)
fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun main(args: Array<String>) { println("Madrigal has left the building".addEnthusiasm()) }
Exécutez Extensions.kt et voyez si la fonction d'extension ajoute un point d'exclamation à la chaîne, comme prévu.
Est-il possible de sous-classer String pour ajouter cette capacité aux instances String? Dans IntelliJ, examinez le code source de la déclaration de chaîne en appuyant deux fois sur la touche Maj pour ouvrir la boîte de dialogue Rechercher partout et entrez «String.kt» dans la zone de recherche. Vous verrez cette déclaration de classe:
public class String : Comparable<String>, CharSequence { ... }
Étant donné que le mot clé open ne figure pas dans la déclaration de la classe String, vous ne pouvez pas sous-classer String pour ajouter de nouvelles fonctionnalités par héritage. Comme mentionné précédemment, les extensions sont une bonne option si vous souhaitez ajouter des fonctionnalités à une classe que vous ne pouvez pas gérer ou ne pouvez pas utiliser pour créer une sous-classe.
Déclaration d'extension de superclasse
Les extensions ne reposent pas sur l'héritage, mais elles peuvent être combinées avec l'héritage pour augmenter la portée. Essayez ceci dans Extensions.kt: déclarez une extension pour le type Any avec le nom easyPrint. Étant donné que l'extension est déclarée pour Any, elle sera disponible pour tous les types. En général, remplacez l'appel de fonction println par l'appel d'extension easyPrint à String.
Listing 18.3. Toute extension (Extensions.kt)
fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun Any.easyPrint() = println(this) fun main(args: Array<String>) { println("Madrigal has left the building".addEnthusiasm()).easyPrint() }
Exécutez Extensions.kt et assurez-vous que la sortie n'a pas changé.
Étant donné que vous avez ajouté l'extension pour le type Any, elle est également disponible pour les sous-types. Ajoutez un appel de poste pour Int.
Listing 18.4. easyPrint est disponible pour tous les sous-types (Extensions.kt)
fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun Any.easyPrint() = println(this) fun main(args: Array<String>) { "Madrigal has left the building".addEnthusiasm().easyPrint() 42.easyPrint() }
Fonctions d'extension génériques
Mais que faire si vous voulez imprimer la ligne «Madrigal a quitté le bâtiment» avant et après addEnthusiasm?
Pour ce faire, ajoutez la possibilité d'appeler dans la chaîne à la fonction easyPrint. Vous avez déjà vu des chaînes d'appels de fonctions: les fonctions peuvent participer à une chaîne si elles renvoient un objet récepteur ou un autre objet pour lequel des fonctions ultérieures peuvent être appelées.
Mettez à niveau easyPrint pour appeler le chaînage.
Listing 18.5. Modifier easyPrint pour appeler le chaînage (Extensions.kt)
fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun Any.easyPrint()= println(this): Any { println(this) return this } ...
Essayez maintenant d'appeler la fonction easyPrint deux fois: avant et après addEnthusiasm.
Listing 18.6. Appelez easyPrint deux fois (Extensions.kt)
fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun Any.easyPrint(): Any { println(this) return this } fun main(args: Array<String>) { "Madrigal has left the building".easyPrint().addEnthusiasm().easyPrint() 42.easyPrint() }
Le code n'a pas été compilé. Le premier appel easyPrint a été autorisé, mais pas addEnthusiasm. Regardez les informations de type pour voir pourquoi cela se produit: cliquez sur easyPrint et appuyez sur Control-Shift-P (Ctrl-P) et dans la liste des extensions qui apparaît, sélectionnez la première: ("Madrigal a quitté le bâtiment .easyPrint ()") (Fig.18.1).
La fonction easyPrint renvoie la chaîne pour laquelle elle a été appelée, mais utilise le type Any pour la représenter. addEnthusiasm est disponible uniquement pour String, il ne peut donc pas être appelé sur la valeur renvoyée par easyPrint.
Pour résoudre ce problème, vous pouvez créer une extension généralisée. Mettez à jour la fonction d'extension easyPrint et utilisez le type générique comme accepteur au lieu de Any.
Listing 18.7. Généralisation d'easyPrint (Extensions.kt)
fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount) fun <T> AnyT.easyPrint(): AnyT { println(this) return this } ...
Maintenant, lorsque l'extension utilise le paramètre du type généralisé T comme récepteur et renvoie T au lieu de Any, les informations sur le type spécifique de l'objet récepteur sont transmises dans la chaîne (Fig. 18.2).
Essayez de réexécuter Extensions.kt. Cette fois, la ligne sortira deux fois:
Madrigal has left the building Madrigal has left the building! 42
Votre nouvelle fonction d'extension généralisée fonctionne avec n'importe quel type et traite également les informations la concernant. Les extensions qui utilisent des types génériques vous permettent d'écrire des fonctions qui peuvent fonctionner avec une grande variété de types dans un programme.
Des extensions pour les types génériques sont également disponibles dans la bibliothèque standard de Kotlin. Par exemple, regardez la déclaration de la fonction let:
public inline fun <T, R> T.let(block: (T) -> R): R { return block(this) }
let est déclaré comme une fonction d'extension générique, ce qui lui permet de fonctionner avec tous les types. Il prend un lambda qui prend l'objet récepteur comme argument (T) et renvoie la valeur d'un nouveau type R.
Faites attention au mot-clé inline, que nous avons appris au chapitre 5. Le même conseil que nous avons donné précédemment s'applique ici: déclarer une fonction d'extension comme intégrée, si elle accepte un lambda, réduit les coûts de mémoire.
»Plus d'informations sur le livre sont disponibles sur
le site Web de l'éditeur»
Contenu»
Extrait25% de réduction sur le coupon pour Khabrozhitel -
KotlinLors du paiement de la version papier du livre, un livre électronique est envoyé par e-mail.