ProgramlamaAndroid geliştirici

Kotlin'de late-initialized property ('lateinit var') nasıl çalışır, nullable özelliklerden farkı nedir ve hangi durumlarda kullanılmalıdır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Sorunun Geçmişi

Kotlin, tür güvenliğine ve null işaretçilerinin önlenmesine odaklanır, ancak genellikle değişkenlerin gecikmeli (late) olarak başlatılması gereksinimi ortaya çıkar, örneğin, bağımlılık enjeksiyonu kullanırken veya Android Aktivitesinde. Bu amaçla lateinit modifikatörü eklenmiştir.

Problem

Normal özellikler zorunlu başlatma gerektirir veya nullable olmalıdır, bu da gecikmeli ancak zorunlu başlatmanın garanti edildiği durumlarda rahatsız edicidir. Nullable türlerin kullanımı kodu karmaşık hale getirir ve ek null kontrolleri gerektirir.

Çözüm

lateinit, başlangıçta başlatılmamış bir özellik oluşturmanıza izin verir, ancak derleyiciye ilk kullanımdan önce başlatılacağına söz verirsiniz. Başlatma, yapıcıda değil, daha sonra yapılabilir.

class UserViewModel { lateinit var repository: UserRepository fun onCreate() { repository = UserRepository() } fun getData() = repository.load() }

Ana özellikler:

  • Null kullanmaktan kaçınmayı sağlar ve aynı zamanda başlatmayı geciktirir
  • Başlatılmamış lateinit özelliğe erişim sırasında UninitializedPropertyAccessException fırlatır
  • Sadece var için geçerlidir ve ilkel türler (Int, Double vb.) için geçerli değildir.

Kandırıcı Sorular.

lateinit, val özellikleri için kullanılabilir mi?

Hayır. lateinit sadece var ile çalışır, çünkü val hemen bir kez başlatılmalıdır veya getter aracılığıyla yapılmalıdır.

lateinit, Int, Boolean, Double ve diğer ilkel türlerle çalışır mı?

Hayır. Sadece nesne referans türleri ile çalışır. İlkel türler için nullable türler kullanın.

lateinit özelliğe başlatmadan erişirseniz ne olur?

Kotlin, UninitializedPropertyAccessException fırlatır:

lateinit var foo: String println(foo) // Hata

Tipik Hatalar ve Antipatternler

  • lateinit özelliği başlatmayı unuttum — uygulama çökecek
  • isInitialized kontrolü ile nullable anlamsal anlamına ihtiyaç duyulan yerlerde kullanım
  • İlkel türler ve val için kullanma

Hayattan Bir Örnek

Olumsuz Vakalar

Geliştirici, lateinit var item: String tanımladı, ilk kez getItem metodunu çağırmadan başlatmadı. Sonuç: uygulama çökmesi.

Artıları:

  • Uygun şekilde başlatıldığında nullables'tan kurtarır

Eksileri:

  • Yaşam döngüsünü karıştırma riski ve çalışma zamanı hatası alma

Olumlu Vakalar

Android Aktivitesi: lateinit var presenter, onCreate'de başlangıç. presenter'ı tüm yaşam döngüsü metodlarında kullanmak güvenlidir: nullability gerekmez.

Artıları:

  • Okunabilirliği artırır, gereksiz kontrollerden kaçınır
  • Zorunlu başlatmayı garanti eder

Eksileri:

  • Başlatma sırasını açıkça izleme zorunluluğu