Initialiser les attributs autrement
Initialiser les attributs plus tard
Au chapitre Le type nullable, il est dit qu’une variable qui n’est pas initialisée instantanément ou un attribut qui n’est pas initialisé dès l’appel au constructeur doit obligatoirement être déclaré comme nullable.
En réalité, le langage Kotlin offre tout ce qu’il faut pour contourner cette limitation.
Avec les concepts étudiés jusqu’à présent, il n’est pas simple de déclarer un attribut dans une classe sans le déclarer nullable et sans l’initialiser dans le constructeur de la classe.
Soit une classe Dog qui possède deux attributs : un nom et un tatouage.
Un chien portant un nom dès sa naissance, nous pouvons initialiser cet attribut dans le constructeur pour éviter d’en faire un attribut nullable. Le tatouage ne pouvant se faire qu’après le passage chez le vétérinaire, ce second attribut doit pouvoir être initialisé dans un second temps, ce qui implique qu’il soit déclaré comme étant nullable.
data class Dog(val name: String)
{
var tatoo: String? = null
private set
fun generateTatoo()
{
tatoo = "$name-123"
}
}
Le fait...
Initialisation paresseuse des attributs
L’initialisation paresseuse permet d’initialiser l’attribut d’une classe uniquement lors de sa première utilisation.
Reprenons l’exemple précédent autour d’un chien et d’un tatouage pour illustrer ce nouveau concept. Le chien porte un nom dès sa naissance, mais cette fois le tatouage du chien doit se faire automatiquement lors de la première utilisation de l’attribut associé.
Pour mettre en place un tel scénario, il convient d’utiliser un concept du langage Kotlin que l’on appelle les delegates. Il s’agit de déclarer un attribut comme un attribut classique, mais de l’initialiser dans un bloc spécifique : by lazy { }, comme suit :
data class Dog(val name: String)
{
val tatoo by lazy { }
}
Un attribut déclaré à l’aide du mot-clé lateinit demande le mot-clé var tandis qu’un attribut déclaré à l’aide du bloc by lazy { } demande le mot-clé val.
Complétons l’initialisation de l’attribut tatoo en modifiant le contenu qui se trouve entre les accolades du bloc. Il est possible d’écrire autant d’instructions que l’on veut pour, par exemple, implémenter...
En résumé
-
Il est possible d’utiliser des éléments spécifiques du langage Kotlin pour initialiser des attributs de classe autrement que dans le constructeur, sans que ces attributs soient nullables pour autant.
-
Le mot-clé lateinit permet de déclarer un attribut non nullable tout en laissant la possibilité de l’initialiser en dehors du constructeur.
-
Un attribut déclaré avec le mot-clé lateinit est obligatoirement un attribut accessible en lecture et en écriture (var).
-
Il est possible de créer une initialisation paresseuse des attributs à l’aide du bloc by lazy { }.
-
Un attribut déclaré avec le bloc by lazy { } est obligatoirement un attribut en lecture seul (val).
-
Le bloc by lazy { } peut contenir plusieurs instructions.
-
Le bloc by lazy { } est compatible avec l’inférence de type.