Middle
Wat is het verschil tussen het gebruik van het trefwoord 'lateinit' en delegatie met 'by lazy {}' in Kotlin?
sobes.tech AI
Antwoord van AI
lateinit wordt gebruikt voor uitgestelde initialisatie van wijzigbare eigenschappen (var) die niet null kunnen zijn en later geïnitialiseerd zullen worden, bijvoorbeeld in de levenscyclusmethode van een activiteit of fragment. De compiler garandeert geen initialisatie, en toegang tot een niet-geïnitialiseerde eigenschap zal een UninitializedPropertyAccessException veroorzaken.
by lazy {} wordt gebruikt voor uitgestelde initialisatie van onveranderlijke eigenschappen (val). De initialisatie gebeurt bij de eerste toegang tot de eigenschap, en het resultaat wordt gecached. Dit is standaard thread-safe en garandeert dat de initializer slechts één keer wordt aangeroepen.
| Kenmerk | lateinit |
by lazy {} |
|---|---|---|
| Toepasbaar op | var |
val |
| Nullbaarheid | Niet nullbaar | Niet nullbaar |
| Garantie van initialisatie | Nee (alleen door ontwikkelaar) | Ja (bij eerste toegang) |
| Threadveiligheid | Niet gegarandeerd standaard | Ja (standaard) |
| Eigenschapstype | Wijzigbaar | Onwijzigbaar |
Voorbeeld met 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 = "Hallo, lateinit!"
}
}
Voorbeeld met by lazy {}:
class MyViewModel : ViewModel() {
private val apiService: ApiService by lazy { provideApiService() } // Initialisatie bij eerste gebruik
private fun provideApiService(): ApiService {
// Logica voor het maken van ApiService
return ApiService()
}
fun fetchData() {
// apiService wordt hier geïnitialiseerd bij de eerste aanroep van fetchData()
apiService.getData()
}
}