Bonjour,

Je développe mon premier projet en Kotlin, et je m'interroge sur l'accès aux val dans une classe.

J'ai une classe dans laquelle j'ai besoin de temps à autre d'accéder à une valeur construite à partir de valeurs du constructeur. Je n'en ai pas toujours besoin pour chaque instance, et vu que la construction consomme du temps CPU inutilement si je ne l'utilise pas, j'ai créé ceci (en prenant une bête classe comme exemple basique)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
class test1(val nbre: Int)
{
    fun getSquare():Int
    {
        return nbre * nbre
    }
}
Donc, c'est classique: Si je n'ai pas besoin d'accéder à mon carré le calcul n'est pas effectué et donc pas de gaspillage.
Par contre, si j'utilise plusieurs fois cette valeur elle est recalculée plusieurs fois via la fonction getSquare.
Sans compter que "Maclass.getChose" n'est pas très "Kotlin", qui est plutôt dans la démarche: Maclass.square

Bref, je modifie alors en ceci:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
class test2(val nbre: Int)
{
    val square = nbre * nbre
}
Mais là, ce qui est derrière est un peu opaque, et donc je me dis qu'à première vue, val étant une variable readonly, que probablement elle est calculée dès que j'instancie un membre de ma classe test2.
Et donc que dans ce cas j'effectue toujours le calcul même si je n'utilise pas square
Bref, pour être certain, je passe à ceci:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
class test3(val nbre: Int)
{
    val square: Int by lazy{getSquare()}
 
    fun getSquare():Int
    {
        return nbre * nbre
    }
}
Et là je me dis que si je n'utilise pas square il n'est pas calculé, et que si je l'utilise il sera calculé une seule fois à la première utilisation.
Pas de chance, le compilateur me renvoie une erreur en me disant que j'ai deux fois la même chose.
Manifestement il a lui-même créé un getSquare à partir du square. Il a détecté que getSquare (avec majuscule à Square) était la demande de la val square (avec minuscule).
Du coup, je remplace "getSquare" par n'importe quel autre nom, et ça fonctionne. Mais je me dis que si le compilateur a créé la correspondance automatique, que je me torture peut-être pour rien en écrivant tout explicitement.

Alors je me (vous) demande la bonne façon d'avoir une val dans une classe, qui ne sera calculée qu'une seule fois, et uniquement si on y accède?

Et du coup, quelle est la différence de résultat effectif entre ces différentes méthodes précédentes, et également qu'apporte cette façon-ci de procéder?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
class test4(val nbre: Int)
{
    val square get() = nbre * nbre
}
Et qu'apporte dans ce cas l'ajout de inline (dont je connais le rôle en langage d'assemblage mais que je ne cerne pas bien dans ce cas-ci?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
class test5(val nbre: Int)
{
    val square inline get() = nbre * nbre
}
Je remercie tout spécialiste de Kotlin qui pourra m'aider à bien comprendre les différents mécanismes mis en jeu dans les méthodes précédentes, et qui me dira la façon la plus simple pour arriver à ce que je recherche

A+
Claude