Published by

Il y a 4 ans -

Temps de lecture 3 minutes

Pépite #6 – Comprendre les fonctions standard de Kotlin : les fonctions de mutation

Dans la précédente pépite, nous avons fait un focus sur les fonctions de transformation. Nous nous attaquons maintenant aux fonctions de mutation.

Pour commencer, une fonction de mutation a pour objectif principal d’appliquer des changements sur un objet. Son comportement devient explicite par son nommage.

apply

Nous, développeurs Kotlin, avons tendance à utiliser apply comme un Builder. C’est-à-dire, nous utilisons cette fonction pour charger les propriétés de l’objet appliqué pour une configuration post-construction.

apply expose l’objet comme this contrairement à let.

Quelque soit la valeur retournée, elle sera ignorée en gardant la valeur d’origine.

[java]data class Person(var name : String, var age: Int)
var person = Person("Henri Pottier", 26)

// Before ‘apply’
person.name = "Henri Quatre"
person.age = 23
result = person

// With ‘apply’
var result = person.apply {
name = "Henri Quatre"
age = 23
"Some new text to everyone" // return value ignored
}
// person = Person(name=Henri Quatre, age=23)
// result = Person(name=Henri Quatre, age=23)[/java]

also

Comme son nom l’indique, also est utilisé pour ajouter du code supplémentaire en retournant l’objet appelé. Comme apply, also peut surcharger des propriétés de l’objet.

Généralement utilisé pour ajouter des traitements additionnels à une chaine de fonctions let, apply ou run (exemple pour ajouter du logging debug).

Lorsque vous enchainez plusieurs fonctions, n’hésitez-pas à renommer la paramètre it pour éviter la confusion.

[java]var person = Person("Henri Pottier", 26)
var result = person.also {
it.name = "Henri Quatre"
"Some new text to everyone"
}
// person = Person(name=Henri Quatre, age=26)
// result = Person(name=Henri Quatre, age=26)

// Before ‘also’
person.name = "John Doe"
person.age = 61
val result = person.age * 2
print("New person named ${person.name}")
Log.d("Person ${person.name} setted")

// With ‘also’
person.apply {
name = "John Doe"
age = 61
}.also {
val result = it.age * 2
print("New person named ${it.name}")
}.also { p ->
Log.d("Person ${p.name} setted")
}
// person = Person(name=John Doe, age=61)
[/java]

with

Enfin, with se dissocie en n’étant pas applicable à un objet pour effectuer des traitements avec celui-ci.

Comme apply, with permet de regrouper de multiple appels de méthodes mais retourne également un résultat de type quelconque.

A savoir, très important, nous ne pouvons utiliser with avec une variable nullable !!! Dans ce cas là, il faut utiliser apply.

[java]// Before ‘with’
val car = Car(name = "Pegasus")
car.start()
print("${car.name} is on the road")
car.goStraight()
car.turnLeft()
car.stop()
result = "${car.name} stopped"

// With ‘with’
var result = with(car) {
start()
print("$name is on the road")
goStraight()
turnLeft()
stop()
"$name stopped"
}
// result = "Pegasus stopped"[/java]

 

Nous avons parcouru toutes les fonctions d’extension proposées par Kotlin. Nous avons essayé de clarifier les fonctions pour vous aider à maitriser l’utilisation de ces fonctions de manière appropriée.

Comme précédemment évoqué, montrez l’intention de votre code par sa forme de rédaction.

 

 

Published by

Commentaire

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous recrutons

Être un Sapient, c'est faire partie d'un groupe de passionnés ; C'est l'opportunité de travailler et de partager avec des pairs parmi les plus talentueux.