Middle
Mis vahe on 'lateinit' märksõna kasutamisel ja delegeerimisel 'by lazy {}' Kotlinis?
sobes.tech AI
Vastus AI-lt
lateinit kasutatakse muudetavate omaduste (var) edasilükkamiseks initsialiseerimiseks, mis ei saa olla nullable ja mis initsialiseeritakse hiljem, näiteks tegevuse või fragmenti elutsükli meetodis. Kompilaator ei taga initsialiseerimist ning juurdepääs initsialiseerimata omadusele põhjustab UninitializedPropertyAccessException vea:
by lazy {} kasutatakse muutumatute omaduste (val) edasilükkamiseks ja initsialiseerimiseks. Initsialiseerimine toimub esimese juurdepääsu ajal ning tulemus salvestatakse vahemällu. See on voogude jaoks turvaline ja tagab, et initsialiseerija kutsutakse ainult üks kord.
| Märge | lateinit |
by lazy {} |
|---|---|---|
| Rakendub sellele | var |
val |
| Nullable | Ei ole nullable | Ei ole nullable |
| Initsialiseerimise garantii | Ei (ainult arendaja) | Jah (esimese juurdepääsu ajal) |
| Voogude turvalisus | Ei garanteerita vaikimisi | Jah (vaikimisi) |
| Omaduse tüüp | Muudetav | Muutumatud |
Näide lateinit-iga:
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!"
}
}
Näide by lazy {}-ga:
class MyViewModel : ViewModel() {
private val apiService: ApiService by lazy { provideApiService() } // Initsialiseerub esimesel kasutamisel
private fun provideApiService(): ApiService {
// ApiService loomise loogika
return ApiService()
}
fun fetchData() {
// apiService initsialiseerub siin esimese kutsumise ajal fetchData()
apiService.getData()
}
}