تكرار السؤال: …
الإجابة المختصرة
تفوّض getter و setter لكائن Delegate، وتضمن by lazy تهيئة القيمة مرة واحدة فقط عند أول وصول إليها.
الشرح
تستخدم Delegated Properties الكلمة المفتاحية by لتمرير منطق القراءة والتعديل لكلاس يطبق getValue و setValue. الـ delegate الشائع by lazy يؤجل التهيئة الثقيلة حتى أول استدعاء ويكون Thread-Safe افتراضيًا (LazyThreadSafetyMode.SYNCHRONIZED)، مما يحافظ على سرعة الإقلاع واستهلاك الذاكرة.
مثال بالكود
val database: AppDatabase by lazy {
Room.databaseBuilder(context, AppDatabase::class.java, "app.db").build()
}
// Custom delegate
class PreferenceDelegate<T>(val key: String, val default: T) {
operator fun getValue(thisRef: Any?, property: KProperty<*>): T = ...
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) = ...
}أخطاء شائعة
- استخدام by lazy مع المتغيرات القابلة للتعديل var (lazy تدعم val فقط).
- الاعتماد على by lazy للوصول إلى Context أو View قبل اكتمال مرحلة onCreate في الـ Activity.