Sobes.tech
Middle

Kotlin'da 'lateinit' kalit so'zidan foydalanish va 'by lazy {}' yordamida delegatsiya qilish o'rtasidagi farq nima?

sobes.tech AI

AIdan javob

lateinit o'zgaruvchilarning kechiktirilgan boshlanishi uchun ishlatiladi (var), ular null bo'lishi mumkin emas va keyinchalik, masalan, faoliyat yoki fragmentning hayot aylanishi metodida boshlanishi kerak bo'lgan o'zgaruvchilar uchun. Kompilyator boshlanishini kafolatlamaydi, va boshlanmagan xususiyatga kirish UninitializedPropertyAccessException xatosini keltirib chiqaradi.

by lazy {} o'zgarmas xususiyatlarning kechiktirilgan boshlanishi uchun ishlatiladi (val). Boshlanish birinchi kirishda amalga oshiriladi va natija keshga olinadi. Bu odatda iplararo xavfsiz va faqat bir marta chaqirilishini kafolatlaydi.

Xususiyat lateinit by lazy {}
Qo'llash mumkin var val
Null bo'lishi mumkin Yo'q (faqat dasturchi tomonidan) Ha (birinchi kirishda)
Boshlanish kafolati Yo'q (faqat dasturchi tomonidan) Ha (birinchi kirishda)
Ip xavfsizligi Kafolatlanmagan default Ha (standart)
Xususiyat turi O'zgaruvchan O'zgarmas

lateinit bilan misol:

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 = "Salom, lateinit!"
    }
}

by lazy {} bilan misol:

class MyViewModel : ViewModel() {

    private val apiService: ApiService by lazy { provideApiService() } // Birinchi foydalanishda boshlanadi

    private fun provideApiService(): ApiService {
        // ApiService yaratish logikasi
        return ApiService()
    }

    fun fetchData() {
        // fetchData() birinchi chaqirilganda apiService bu yerda boshlanadi
        apiService.getData()
    }
}