Middle
Kotlin-də 'lateinit' açar sözünün istifadəsi ilə 'by lazy {}' ilə nümayəndəlik arasındakı fərq nədir?
sobes.tech Süni İntellekt
AI-dan cavab
lateinit dəyişənləri, null ola bilməyən və daha sonra, məsələn, aktivlik və ya fragmentin həyat dövrü metodunda başlanacaq dəyişənlər üçün gecikdirilmiş başlanğıc üçün istifadə olunur. Kompilyator başlanğıcı təmin etmir və başlanmamış xüsusiyyətə giriş UninitializedPropertyAccessException istisnasını törədər.
by lazy {} dəyişməz xüsusiyyətlərin gecikdirilmiş başlanğıcı üçün istifadə olunur (val). Başlanğıc ilk girişdə həyata keçirilir və nəticə keşikdə saxlanılır. Bu, standart olaraq ipliklərarası təhlükəsizdir və yalnız bir dəfə çağırılmasını təmin edir.
| Xüsusiyyət | lateinit |
by lazy {} |
|---|---|---|
| Tətbiq olunan | var |
val |
| Nullability | Null deyil | Null deyil |
| Başlanğıc zəmanəti | Yox (yalnız inkişaf etdirici tərəfindən) | Bəli (ilk girişdə) |
| İplik təhlükəsizliyi | Standart olaraq zəmanət verilmir | Bəli (standart) |
| Xüsusiyyət tipi | Dəyişkən | Dəyişməz |
lateinit ilə nümunə:
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 = "Salam, lateinit!"
}
}
by lazy {} ilə nümunə:
class MyViewModel : ViewModel() {
private val apiService: ApiService by lazy { provideApiService() } // İlk istifadə zamanı başlanır
private fun provideApiService(): ApiService {
// ApiService yaradılması loqikası
return ApiService()
}
fun fetchData() {
// fetchData() ilk çağırışda apiService burada başlanır
apiService.getData()
}
}