Avatar ·

تهيئة الخصائص في Kotlin: `by lazy` مقابل `lateinit` — متى نستخدم أيهما؟

مرحبًا بالجميع! أنا أنتقل من Java إلى Kotlin وواجهت صعوبة في فهم الفرق بين `by lazy` و `lateinit` للتهيئة المتأخرة للخصائص. يبدو أن كلاهما يحل نفس المشكلة — عدم تهيئة الخاصية فورًا عند إنشاء الكائن، بل القيام بذلك لاحقًا عندما تكون هناك حاجة فعلية إليها. لكني أخلط باستمرار بين أي خيار أختار. على سبيل المثال، أكتب ViewModel بسيطًا لنظام Android. أحتاج إلى الحصول على مرجع إلى repository يتم تهيئته عبر DI (Dagger/Hilt)، لكني لا أريد جعله nullable: ```kotlin // الخيار مع lateinit class MyViewModel : ViewModel() { lateinit var repository: MyRepository fun loadData() { // هنا أنا متأكد من أن repository قد تمت تهيئته بالفعل repository.fetchData() } } ``` ```kotlin // الخيار مع lazy class MyViewModel : ViewModel() { val repository: MyRepository by lazy { MyRepository() // أو أي مصنع آخر } } ``` في الحالة الأولى، يجب علي استدعاء `repository = ...` في مكان ما قبل