Sobes.tech
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()
    }
}