Quand doit-on utiliser 'lateinit' et 'by lazy' en Kotlin?
sobes.tech IA
Réponse de l'IA
lateinit est utilisé pour les propriétés non nullables qui seront initialisées plus tard, avant la première utilisation. Il s'applique avec var.
class UserActivity : AppCompatActivity() {
lateinit var binding: ActivityUserBinding // S'initialisera dans onCreate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityUserBinding.inflate(layoutInflater)
setContentView(binding.root)
// Maintenant, on peut utiliser binding
}
}
by lazy est utilisé pour les propriétés non nullables ou nullables, qui s'initialisent au premier accès. Il s'applique avec val.
class DataManager {
val apiService: ApiService by lazy {
Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
}
Comparaison :
| Caractéristique | lateinit |
by lazy |
|---|---|---|
| Utilisation | var |
val |
| Type de propriété | Non nullable | Non nullable ou nullable |
| Initialisation | Tardive, manuelle | Lors du premier accès, automatique |
| Sécurité thread | Non garanti par défaut (si non synchronisé manuellement) | Garantit par défaut (synchronisé) |
| Valeur nulle | Non autorisée avant initialisation (lance une exception) | Non (le type est déterminé par l'initialisateur) |
Utilisez lateinit lorsque la valeur de la propriété dépend du contexte ou d'autres facteurs et doit être définie après la création de l'objet, mais avant son utilisation (par exemple, lors de la liaison de vues dans une Activity Android).
Utilisez by lazy pour les propriétés coûteuses à créer ou qui peuvent ne pas être nécessaires pendant toute la durée de vie de l'objet, ou lorsque l'initialisation doit être différée jusqu'au premier usage réel.