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.
Commentaire