Why Kotlin

Jeremie Guidoux
08/05/2017

Slickteam était présent au meetup AndroidRennes à la French Tech de Rennes/Saint Malo sur le thème Develop your next app with Kotlin.

Ceux pour qui Kotlin ne parle pas du tout, petit rappel wikipédia : Kotlin est un langage de programmation orienté objet et fonctionnel, avec un typage statique fort qui permet de compiler pour la JVM et JavaScript. Son développement provient principalement d’une équipe de programmeurs chez JetBrains basée à Saint-Pétersbourg en Russie (son nom vient de l’île de Kotline, près de St. Pétersbourg).

La dernière version la 1.1.2 est sortie le 25 avril 2017.

L’objectif de Kotlin est de faire mieux que JAVA en écrivant des programmes plus concis, plus compréhensibles et de manière plus simple à coder tout en gardant le coté safe. Son interopérabilité avec JAVA 6 et Java 8 depuis la version 1.1 est totale et Kotlin est 100% open source.

Par rapport à Groovy, Kotlin apporte le type statique et surtout le null safety. Le compilateur prévient le plus rapidement possible des erreurs et donne des conseils. Concernant Scala, Kotlin est presque aussi puissant en utilisant seulement une petite partie des fonctionnalités.

Kotlin n’est pas juste du syntaxique c’est une meilleure approche et une meilleure manière de coder.

Un aperçu des apports de Kotlin :

Kotlin est disponible sous forme de plugin ready to use dans intelliJ, Eclipse et Netbean.

Le typage VAL et VAR :

  • VAL est une constante immutable

  • VAR est une variable mutable

Les POJO des classes sont définis par défaut :

data class Personne(val prenom: String, val nom: String, val age: Int = 0)

Cette classe génère les getter, les setter, le conscruteur, les methods equals et hashcode et copy, et est utilisable normalement dans un code java. A noter qu’on peut mettre des valeurs par défaut comme age dans cette classe, ce quiévite de créer de multiples constructeurs ou des factories.

Null safety, c’est un des gros atouts de Kotlin qui bloque les erreurs nullPointerException et qui empêche la déclaration d’une variable qui pourrait être nulle. Si besoin il faut forcer le typage à nullable par l’opérateur Elvis ?. . Pour appeler une variable nulle il faut utiliser l’opérateur Bang Bang !!..

Utilisation des lambdas, permet de passer des fonctions en paramètre de fonctions, et également des blocs de traitement qui vont alors correspondre à des fonction anonymes. Cela permet à des fonctions d’avoir en paramètre non seulement des variables mais également d’autre fonctions. Une lambda expression s’écrit en général entre {}.

var list = listOf(1, 2, 3)
list.forEach 

Cela permet d’afficher tous les éléments d’une liste sans avoir à passer par une boucle for supplémentaire. Les opérateurs filter, sort, range, … sont utilisables directement.

Autre exemple, afficher toutes les personnes dont le nom de famille commence par ‘Gui’ mais en majuscule :

var listdePersonnes = listOf(     
Personne("Audrey", "Guidoux", 17),     
Personne("Chrisline", "Victor", 9),     
Personne("Jeremie", "Guidoux", 32),)
listdePersonnes.filter { p-> p.nom.startWith("Gui")}     
.map { p -> Personne(p.prenom, p.nom, toUpperCase(), p.age) }     
.forEach { p -> println("$ $") } }

Les déclarations desctructurées permettent de récupérer les éléments qui nous intéressent uniquement, les autres valeurs sont remplacées par des _.

val audrey = Personne("Audrey", "Guidoux", 17)
val Prenom, nom, _) = audrey
println("$ $")

When remplace le traditionnel switch case.

when (audrey.age) {
     in 1..10 -> println("Je suis un enfant")
     in 11..20 -> println("Je suis un adolescent")
     else -> println("Je suis un adulte")
}

Les extensions sont l’une des killer feature de Kotlin. Kotlin permet l’extension d’une classe avec de nouvelles fonctionnalités. Les extensions ne modifient pas la classe qu’elles étendent mais ajoutent de nouvelles fonctions. Il est ainsi possible d’enrichir grandement le potentiel d’un langage ou une bibliothèque. A noter que la méthode d’extension ne peut accéder qu’aux fonctions publiques de sa classe. Il n’y a donc pas de risque de corruption de la classe d’origine.

Exemple : récupérer l’extension d’un fichier

val MonFichier = File("monfichier.doc")
println(monFichier.extension)
public val File.extension: String
     get() = name.substringAfterLast('.',"")

On voit dans ce second exemple que l’extension est un getter de la classe File rajouté par le système d’extension qu’on utilise de manière transparente.

Chez Slickteam, on est convaincu de l’apport de Kotlin. Il apporte la même concision que Groovy mais les types statiques et le null safety sont des gros plus. L’enrichissement du code grâce aux extensions est une des caractéristiques majeures de Kotlin, il permet d’obtenir un code d’une richesse croissante. Kotlin favorise la productivité et la qualité du code. Une migration depuis java peut se faire petit a petit et la courbe d’apprentissage est rapide. Enfin le gap est moindre quand on fait du java8 plutôt que du java6 mais cela reste toujours intéressant.

Slickteam