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