Middle
Kokia yra skirtumas tarp 'lateinit' raktažodžio naudojimo ir delegavimo su 'by lazy {}' Kotlin'e?
sobes.tech AI
Atsakymas iš AI
lateinit naudojamas atidėto inicializavimo keičiamoms savybėms (var), kurios negali būti nullable ir bus inicializuotos vėliau, pavyzdžiui, veiklos ar fragmento gyvavimo ciklo metode. Kompiliatorius ne garantuoja inicializaciją, ir prieiga prie neįgyvendintos savybės sukels UninitializedPropertyAccessException klaidą:
by lazy {} naudojamas atidėto ir nekintamų savybių (val) inicializavimui. Inicializacija vyksta pirmojo prieigos metu, ir rezultatas yra saugomas keše. Tai yra srauto saugu ir garantuoja, kad inicializatorius bus iškviestas tik vieną kartą.
| Žymeklis | lateinit |
by lazy {} |
|---|---|---|
| Taikoma | var |
val |
| Nullable | Nėra nullable | Nėra nullable |
| Inicializacijos garantija | Nėra (tik programuotojo) | Taip (pirmojo prieigos metu) |
| Srauto saugumas | Ne garantuojama pagal numatytuosius nustatymus | Taip (pagal numatytuosius) |
| Savybės tipas | Keičiamas | Nekintamas |
Pavyzdys su 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 = "Hello, lateinit!"
}
}
Pavyzdys su by lazy {}:
class MyViewModel : ViewModel() {
private val apiService: ApiService by lazy { provideApiService() } // Inicializacija pirmo naudojimo metu
private fun provideApiService(): ApiService {
// ApiService sukūrimo logika
return ApiService()
}
fun fetchData() {
// apiService inicializuojasi čia pirmo iškvietimo fetchData() metu
apiService.getData()
}
}