Sobes.tech
Middle

Kotlin'de 'lateinit' anahtar kelimesinin kullanımı ile 'by lazy {}' ile delegasyon arasındaki fark nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

lateinit değişkenleri, null olamayan ve daha sonra, örneğin bir aktivitenin veya fragmentin yaşam döngüsü metodunda başlatılacak olan değişkenlerin gecikmeli başlatılması için kullanılır. Derleyici, başlatmayı garanti etmez ve başlatılmamış bir özelliğe erişim UninitializedPropertyAccessException hatasına yol açar.

by lazy {} ise, değiştirilemez (val) özelliklerin gecikmeli başlatılması için kullanılır. Başlatma, özelliğe ilk erişimde yapılır ve sonuç önbelleğe alınır. Bu varsayılan olarak thread-safe'dir ve başlatıcının yalnızca bir kez çağrılmasını garanti eder.

Özellik lateinit by lazy {}
Uygulanabilir var val
Nullability Null değil Null değil
Başlatma garantisi Yok (sadece geliştirici tarafından) Evet (ilk erişimde)
Thread güvenliği Varsayılan olarak garanti edilmez Evet (varsayılan)
Özellik tipi Değiştirilebilir Değiştirilemez

lateinit ile örnek:

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

by lazy {} ile örnek:

class MyViewModel : ViewModel() {

    private val apiService: ApiService by lazy { provideApiService() } // İlk kullanımda başlatılır

    private fun provideApiService(): ApiService {
        // ApiService oluşturma mantığı
        return ApiService()
    }

    fun fetchData() {
        // fetchData() ilk çağrıldığında apiService burada başlatılır
        apiService.getData()
    }
}