Wanneer moet je 'lateinit' en 'by lazy' gebruiken in Kotlin?
sobes.tech AI
Antwoord van AI
lateinit wordt gebruikt voor niet-nullbare eigenschappen die later worden geïnitialiseerd, voor de eerste toegang tot hen. Het wordt toegepast met var.
class UserActivity : AppCompatActivity() {
lateinit var binding: ActivityUserBinding // Wordt geïnitialiseerd in onCreate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityUserBinding.inflate(layoutInflater)
setContentView(binding.root)
// Nu kan binding worden gebruikt
}
}
by lazy wordt gebruikt voor niet-nullbare of nullable eigenschappen die bij eerste toegang worden geïnitialiseerd. Het wordt toegepast met val.
class DataManager {
val apiService: ApiService by lazy {
Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
}
Vergelijking:
| Kenmerk | lateinit |
by lazy |
|---|---|---|
| Toepassing | var |
val |
| Eigenschapstype | Non-nullable | Non-nullable of nullable |
| Initialisatie | Laat, handmatig | Bij eerste toegang, automatisch |
| Threadveiligheid | Niet standaard gegarandeerd (moet handmatig gesynchroniseerd worden) | Standaard gegarandeerd (gesynchroniseerd) |
| Nullwaarde | Niet toegestaan vóór initialisatie (zal uitzondering werpen) | Nee (type wordt bepaald door de initializer) |
Gebruik lateinit wanneer de waarde van de eigenschap afhankelijk is van de context of andere factoren en moet worden ingesteld na het maken van het object, maar voor het gebruik ervan (bijvoorbeeld bij het binden van views in een Android-activiteit).
Gebruik by lazy voor eigenschappen die kostbaar zijn om te maken of mogelijk niet nodig zijn gedurende de hele levensduur van het object, of wanneer je de initialisatie wilt uitstellen tot het eerste daadwerkelijke gebruik.