Middle
Quelle est la différence entre l'utilisation du mot-clé 'lateinit' et la délégation avec 'by lazy {}' en Kotlin?
sobes.tech IA
Réponse de l'IA
lateinit est utilisé pour l'initialisation différée des propriétés modifiables (var) qui ne peuvent pas être nulles et seront initialisées plus tard, par exemple dans la méthode du cycle de vie d'une activité ou d'un fragment. Le compilateur ne garantit pas l'initialisation, et accéder à une propriété non initialisée provoquera une exception UninitializedPropertyAccessException.
by lazy {} est utilisé pour l'initialisation différée des propriétés immuables (val). L'initialisation se fait lors du premier accès à la propriété, et le résultat est mis en cache. C'est thread-safe par défaut et garantit que l'initialisateur sera appelé une seule fois.
| Caractéristique | lateinit |
by lazy {} |
|---|---|---|
| Applicable à | var |
val |
| Nullabilité | Non nullable | Non nullable |
| Garantie d'initialisation | Non (seulement par le développeur) | Oui (au premier accès) |
| Sécurité thread | Non garanti par défaut | Oui (par défaut) |
| Type de propriété | Modifiable | Immodifiable |
Exemple avec lateinit:
class MyActivity : AppCompatActivity() {
private lateinit var textView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textView = findViewById(R.id.my_text_view)
textView.text = "Bonjour, lateinit!"
}
}
Exemple avec by lazy {}:
class MyViewModel : ViewModel() {
private val apiService: ApiService by lazy { provideApiService() } // Initialisation à la première utilisation
private fun provideApiService(): ApiService {
// Logique de création d'ApiService
return ApiService()
}
fun fetchData() {
// apiService est initialisé ici lors du premier appel à fetchData()
apiService.getData()
}
}