Kotlin in action
Tags: kotlin, java
Published: 2020-04-08 10:18:05

---
title: Kotlin in action
published: true
date: 2016-04-26 00:00:00 UTC
tags: kotlin, java
canonical_url: https://slashgear.github.io/fr/kotlin/
---

JetBrains, pour les développeurs Java enfermés dans une grotte et neconnaissant qu’Eclipse, outre le fait de fournir une suite d’outilspour le développement et un IDE Java (IntelliJ), s’est lancé en 2011dans la création d’un nouveau langage de programmation. **Plein depromesses, ce langage, le Kotlin, présenté par Hadi Harriri lors duMix-it 2016, m’a fait forte impression.**

Du jeudi 21 au vendredi 22 avril 2016 se tenait à Lyon la sixièmeédition du Mix-IT. Rassemblant plus de 600 participants, cetteconvention aux allures de grande fête pour développeurs et agilistespermettaient de suivre talks, ateliers, conférences mais égalementd’échanger autour d’une délicieuse crêpe suzette avec des passionnésvenus du monde entier.

En attendant l’article de retour sur le Mix-IT, revenons-en ausujet principal de cet article, le Kotlin. Ne connaissant alors celangage que de nom, j’étais très intrigué par la présentation deMr Hadi Harriri nommée “Kotlin : ready for production”. Après uneprésentation assez sommaire de l’historique du langage et de l’objectifdu projet de Jetbrains, on comprend assez rapidement qu’en introduisantle Kotlin, la firme internationale tente de répondre aux besoins desdéveloppeurs Java en rassemblant dans un langage le meilleur du Scala,des avantages du C#, et une concision poussée à l’extrême. C’est à sedemander si la firme perd espoir en Oracle pour sortir de nouvellesversions de Java plus ambitieuses.

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#la-concision-ok)La concision ok

Comme je le dis plus haut, la concision était une volonté et un objectiftrès clair de Jetbrains pour la création du langage Kotlin. Il estvrai qu’en Java, on peut très facilement se retrouver à avoir duBoilerplate un peu partout. On pense aux getter/setter, très verbeuxpour finalement une fonctionnalité qu’on peut résumer habilement.Évidemment, des plugins comme Lombok permettent par annotation deréduire tous ce volume de code.

_Afin de vous montrer un exemple de concision, voici une comparaisonentre un objet très simple en Java et l’exact équivalent en Kotlin._

Version Java :

```java
public class Person implements Cloneable{

  private String name;

  private Integer id;

  public Person(String name,Integer id){
    this.name = name;
    this.id = id;
  }

  public String getName(){
    return name;
  }

  public void setName(String name){
    this.name = name;
  }

  public Integer getId(){
    return id;
  }

  public void setId(Integer id){
    this.id = id;
  }
  @Override
  public boolean equals(Object obj) {
    if (obj == this) {
      return true;
    }
    if (obj == null || obj.getClass() != this.getClass()) {
      return false;
    }
    Person guest = (Person) obj;
    return id == guest.id && (name == guest.getName || (name != null && name.equals(guest.getName()))));
  }

  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    result = prime * result + id;
    return result;
  }

  @Override
  public String toString(){
    return"Person(name="+name+",id="+id")";
  }

  @Override
  public Object clone(){
     Person person = null;
	    try {
	      	person = (Person) super.clone();
	    } catch(CloneNotSupportedException cnse) {
	      	cnse.printStackTrace(System.err);
	    }
	    person.name = (String) name.clone();
	    person.id = (Integer) id.clone();
	    return person;
  }
}
```

Version Kotlin :

```kotlin
dat class User(val name: String, val id: Int)
```

Les fonctions venant de Object (toString,equals,..) sont apportées parle mot clef “data” devant “class” dans le fichier Kotlin.

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#des-fonctionnalit%C3%A9s-int%C3%A9ressantes)Des fonctionnalités intéressantes

Lors de la conférence du Mix-IT, j’ai pu repérer quelquesfonctionnalités qui me semblent réellement intéressantes à vouspartager dans cet article. Cette liste n’est pas exhaustive, maisdevrait vous donnez un aperçu des possibilités.

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#classes)Classes

Pour déclarer une classe en Kotlin, on peut se débarrasser desgetter/setter, on peut définir un constructeur principal. En outre,on peut même définir la mutabilité des attributs de la classe grâceaux mots clés var (mutable) et val (read-only).

```java
class Person(val firstName: String, val lastName: String, var age: Int) {
  // ...
}
```

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#d%C3%A9clarations-de-fonction-sans-accolades-inline)Déclarations de fonction sans accolades (inline)

On peut déclarer des fonctions sans accolades, c’est assez compacte.On perd un peu en lisibilité mais on gagne en espace.

```kotlin
(fun add(i: Int, j:Int) = i + j)
```

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#des-conditions-plus-simples)Des conditions plus simples

Adieu le switch au profit du when avec des “arrow operators”.

```kotlin
when (x) {
  1 -> print("x == 1")
  2 -> print("x == 2")
  else -> { // Note the block
    print("x is neither 1 nor 2")
  }
}
```

Pour les boucles rien de spécial à noter de particulier mais c’est sur l’opération “if” qu’on peut observer un ajout très pratique.

```kotlin
val max = if (a > b) {
    print("Choose a")
    a
  } else {
    print("Choose b")
    b
  }
```

La dernière expression du block if est la valeur du block. On évitedonc l’initialisation de variables en dehors du bloc et évite samodification dans chacune des branches. On peut remarquer quel’opérateur de fin d’instruction ‘;’ disparaît (en réalitéil est optionnel)

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#adieu-les-nullpointerexception)Adieu les “NullPointerException”

Kotlin a été pensé pour éviter les danger des références null et fairedisparaître les NullPointerException et les “null-check”.

```kotlin
var a: String = "abc"
a = null // compilation error
To allow nulls, we can declare a variable as nullable string, written String?:

var b: String? = "abc"
b = null // ok

b?.length
```

On ne peut pas affecter à une variable la valeur null si on n’a pasdélibérément défini cette variable comme nullable. Le Kotlin introduitégalement le “call safe operator” qui permet de tester la nullité d’unevariable avant l’appel d’un fonction sur cette variable.

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#des-fonctions-callable)Des fonctions “Callable”

En Kotlin, une fonction peut être déclarée en dehors d’un objet. Celapeut paraître étrange vis à vis du Java mais cette fonctionnalité peutêtre très pratique, en particulier pour déclarer la fonction main deson projet.

Une fonction déclarée en dehors d’un objet peut être appelé den’importe quel endroit de cette façon :

```kotlin
fun hello(){
  print("hello")
}

fun main(){
  ::hello()
}
```

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#la-programmation-fonctionnelle-pour-les-gouverner-tous)La programmation fonctionnelle pour les gouverner tous

Le paradigme fonctionnelle est bien sûr présent dans le langage. Ilpermet de réaliser toutes les opérations usuelles (map, reduce,forEach,etc,..)

```kotlin
var sum = 0
ints.filter { it > 0 }.forEach {
  sum += it
}
print(sum)
```

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#les-extension-functions)Les “Extension Functions”

En Kotlin on peut “étendre” une classe par une fonction de manièreassez simple. On peut donc facilement rajouter des méthodes sans passerpar un héritage.

```kotlin
fun MutableList<Int>.swap(index1: Int, index2: Int) {
  val tmp = this[index1] // 'this' corresponds to the list
  this[index1] = this[index2]
  this[index2] = tmp
}
```

Ici le mot-clé “this” permet d’accéder à l’objet étendu.

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#linterop%C3%A9rabilit%C3%A9)L’interopérabilité

La question soulevée par ce nouveau langage vient assez rapidement.Peut-on facilement passer de Java à Kotlin? Est-ce que notre codeKotlin va fonctionner avec tous le code Java que l’on a déjà?Est-ce que nos outils actuels sont adaptés au développement Kotlin?

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#les-ide)Les IDE

Bien évidemment, JetBrains met ses produits en avant pourl’utilisation du Kotlin. On peut en effet utiliser leur célèbre IDEIntellij pour développer dans ce langage. Cerise sur la gâteau, onpeut même utiliser la version Community gratuite pour se faire uneidée. Il existe également un plugin pour Eclipse. Par contre, aucunprojet de plugin n’est en cours pour NetBeans.

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#java)Java

Kotlin permet également une compatibilité avec toutes leslibrairies Java, c’est sûrement l’argument le plus fort et évidemmentmis en avant par JetBrains. Le code créé peut donc fonctionner sur uneJVM de la version 6 à 8.

On peut donc profiter de tous les avantages du langage Kotlin tout enrestant 10 ans en arrière coté virtual machine.Enfin, aucune modification n’est nécessaire pour faire intéragir ducode Java avec du Kotlin. De plus, l’appel de méthode Java estcomplètement transparent pour le Kotlin.

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#javascript)Javascript

Et oui, JetBrains n’a pas voulu ignorer le mouvement récent dudéveloppement Javascript. On peut donc cibler le langage Javascript aubuild afin de faire tourner son application Kotlin sur unenvironnement NodeJS ou bien dans un navigateur.Cette fonctionnalitéest donc à tester. On tient peut-être ici une alternative auTypeScript ?… mais ça reste à mes yeux gadget.

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#android)Android

N’ayant fait que quelques Lab Android, je n’ai pas forcément unevision complète de l’environnement, mais je me souviens avoir été gênépar le nombre de ligne de code Java nécessaire pour obtenir une sisimple application mobile.

Il se trouve que l’on peut dès aujourd’hui développer des applicationsmobiles Android depuis l’IDE recommandé par Google(i.e: Android Studio) en Kotlin, à tester pour les amateurs.

## [<svg aria-hidden="true" focusable="false" height="16" version="1.1" viewbox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>](#spring-boot)Spring Boot

Enfin, on peut voir que le Kotlin intéresse les committers du projetSpring, notamment le lyonnais Sébastien Deleuze avec cet articleintitulé Developing Spring Boot applications with Kotlin. Voir autantd’effervescence autour de ce langage rassure un peu, etpersonnellement je pense tenter l’utilisation du Kotlin dans lecontexte Spring Boot pour me faire une idée plus objective sur le sujet.

D’ailleurs, le Spring Initializr intègre depuis quelques tempsl’option de génération de projet Spring Boot en Kotlin.

N’hésitez pas à aller tester ce langage sur le site et vous fairevotre propre avis sur ce langage. Quand à moi, je vais rapidementl’essayer pour un de mes projets.

D’autres ressources sont disponibles sur le Github d’[Hadi Hariri](https://github.com/hhariri/awesome-kotlin)pourraient vous intéresser