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()
}
}