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