Sobes.tech
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()
    }
}