Sobes.tech
Middle

Kāda ir atšķirība starp 'lateinit' atslēgvārda izmantošanu un deleģēšanu ar 'by lazy {}' Kotlin?

sobes.tech AI

Atbilde no AI

lateinit tiek izmantots atliktai inicializācijai mainīgajām īpašībām (var), kuras nevar būt nullable un kuras tiks inicializētas vēlāk, piemēram, aktivitātes vai fragmenta dzīves cikla metodē. Kompilators neparedz inicializāciju, un piekļuve ne-inicializētai īpašībai izraisīs UninitializedPropertyAccessException kļūdu:

by lazy {} tiek izmantots atliktai un nemainīgai īpašībai (val) inicializācijai. Inicializācija notiek pirmreizējās piekļuves laikā, un rezultāts tiek kešots. Tas ir droši sēriju kontekstā un garantē, ka inicializators tiks izsaukts tikai vienu reizi.

Zīme lateinit by lazy {}
Piemērots tam var val
Nullable Nav nullable Nav nullable
Inicializācijas garantija Nav (tikai izstrādātāja) Jā (pirmreizējās piekļuves laikā)
Sēriju drošība Nav garantēta pēc noklusējuma Jā (pēc noklusējuma)
Īpašības tips Maināms Nemainīgs

Piemērs ar 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!"
    }
}

Piemērs ar by lazy {}:

class MyViewModel : ViewModel() {

    private val apiService: ApiService by lazy { provideApiService() } // Inicializējas pirmās lietošanas laikā

    private fun provideApiService(): ApiService {
        // ApiService izveides loģika
        return ApiService()
    }

    fun fetchData() {
        // apiService tiek inicializēts šeit pirmās izsaukšanas laikā fetchData()
        apiService.getData()
    }
}