Middle
Kotlinде 'lateinit' ачкыч сөзүн колдонуу менен 'by lazy {}' аркылуу делегациялоо арасындагы айырма эмнеде?
sobes.tech AI
AIден жооп
lateinit колдонулат өзгөрмө мүнөздөмөлөрдүн кечиктирилген жана баштапкы мааниге келтирилиши үчүн (var), алар nullable болбойт жана кийинчерээк башталат, мисалы, активдүүлүк же фрагменттин жашоо циклинин методу. Компилятор баштапкы мааниге келтирүүнү кепилдебейт, жана башталбаган мүнөздөмөгө жетүү UninitializedPropertyAccessException катага алып келет:
by lazy {} колдонулат өзгөрмө мүнөздөмөлөрдүн кечиктирилген жана баштапкы мааниге келтирилиши үчүн (val). Баштапкы мааниге биринчи кирүүдө ишке ашырылат жана натыйжасы кэшке сакталат. Бул алдын ала ишке ашырылуу менен коопсуз жана инитциализациячы бир гана жолу чакырылат деп кепилдейт.
| Белги | lateinit |
by lazy {} |
|---|---|---|
| Колдонуу объекти | var |
val |
| Nullableдик | Nullable эмес | Nullable эмес |
| Баштапкы мааниге келтирүү кепилдиги | Жок (тек гана иштеп чыгуучу тарабынан) | Ооба (биринчи кирүүдө) |
| Тоткоо коопсуздугу | Кепилденбейт алдын ала | Ооба (өзүнчө) |
| Мүнөздөмө түрү | Өзгөрүлүүчү | Өзгөрүлбөсү |
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!"
}
}
by lazy {} менен мисал:
class MyViewModel : ViewModel() {
private val apiService: ApiService by lazy { provideApiService() } // Биринчи колдонууда башталат
private fun provideApiService(): ApiService {
// ApiService түзүү логикасы
return ApiService()
}
fun fetchData() {
// apiService биринчи чакырылышында бул жерден башталат
apiService.getData()
}
}