A repository of bitesize articles, tips & tricks
(in both English and French) curated by Mirego’s team.

Kotlin Tips : Quand utiliser l’accesseur get() sur une propriété calculée ?

Une propriété calculée est une propriété dont la valeur s’obtient après l’évaluation d’une expression

L’accesseur sur une propriété, permet de toujours évaluer la valeur de la propriété, avant de retourner la réponse. Il est très important pour les propriétés calculées.

Si l’accesseur n’est pas ajouté à une propriété calculée, alors l’expression de cette propriété sera évaluée uniquement lors de la création de l’objet et ne sera plus évaluée, ce qui peut souvent causer des comportements inattendus.

Soit la classe

class User(var age: Int) {
    val isAdult: Boolean = age >= 18
}

Et considérons notre méthode main suivante pour tester :

fun main() {
    val user = User(14)
    println("User with age: ${user.age} is an adult? ${user.isAdult}")
    user.age = 20
    println("User with age: ${user.age} is an adult? ${user.isAdult}")
}

Le résultat est :

User with age: 14 is an adult? false
User with age: 20 is an adult? false

La valeur de isAdult a été évaluée uniquement lors de la création de l’objet user et est restée inchangée, même après la mise à jour de la propriété age. Ce n’est pas le comportement que nous attendions.

Si on ajoute un accesseur à la propriété isAdult

class User(var age: Int) {
    val isAdult: Boolean
        get() = age >= 18
}

Alors, on obtient le bon résultat 👍

User with age: 14 is an adult? false
User with age: 20 is an adult? true

Dans certains cas, on n’a pas toujours besoin d’évaluer l’expression de la propriété calculée à chaque fois qu’on l’appelle.

Par exemple :

class User(val age: Int) {
    val isAdult: Boolean
        get() = age >= 18
}

Dans le cas ci-dessus, la propriété age est immuable, pas d’intérêt d’évaluer l’expression de la propriété isAdult chaque fois que je l’appelle, car sa valeur ne changera pas.

Donc je peux tout simplement avoir

class User(val age: Int) {
    val isAdult: Boolean = age >= 18
}

Nous venons de voir que l’accesseur sur une propriété peut être inutile dans certains cas, surtout lorsque son expression dépend entièrement des propriétés immuables. Toutefois, je recommande comme bonne pratique de toujours garder l’accesseur sur ces propriétés afin d’éviter une surprise due au fait qu’une propriété est devenue muable ou tout changement similaire.

😎 ✌️