Kotlin Academy · درس

‏by lazy: تعمّق في التهيئة المؤجلة

استكشف أوضاع التهيئة الكسولة: SYNCHRONIZED وPUBLICATION وNONE.

الدرس 1 من 413 خطوة

‏by lazy: تعمّق في التهيئة المؤجلة درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ما هي by lazy؟

تؤجّل by lazy تهيئة قيمة val حتى أول وصول إليها. وتُشغّل اللامبدا مرة واحدة ثم تخزّن النتيجة مؤقتًا.

val greeting: String by lazy {
    println("Computing...")
    "Hello, Kotlin!"
}
fun main() {
    println(greeting) // prints Computing... then Hello, Kotlin!
    println(greeting) // prints Hello, Kotlin! (cached)
}

صياغة lazy

يستقبل مفوّض by lazy لامبدا تُعيد نوع القيمة المستنتج من تعريف الخاصية.

val pi: Double by lazy { Math.PI }
val appName: String by lazy { "MyApp v1.0" }
fun main() {
    println(pi)      // 3.141592653589793
    println(appName) // MyApp v1.0
}

وضع SYNCHRONIZED (الافتراضي)

تستخدم lazy افتراضيًا الوضع LazyThreadSafetyMode.SYNCHRONIZED، بحيث يهيّئ مؤشر ترابط واحد فقط القيمة.

val heavyResource: String by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
    Thread.sleep(100) // simulate work
    "Resource ready"
}
fun main() { println(heavyResource) }

وضع PUBLICATION

يسمح PUBLICATION لعدة مؤشرات ترابط بالتهيئة بالتوازي؛ وتفوز النتيجة الأولى. استخدمه عندما تكون التهيئة بسيطة وخالية من الآثار الجانبية.

val config: Map<String, String> by lazy(LazyThreadSafetyMode.PUBLICATION) {
    mapOf("host" to "localhost", "port" to "8080")
}
fun main() { println(config["host"]) }

وضع NONE

لا يضيف NONE أي كلفة لمزامنة مؤشرات الترابط. استخدمه فقط في السياقات أحادية الخيط عندما يكون الأداء مهمًا.

val singleThreadValue: Int by lazy(LazyThreadSafetyMode.NONE) {
    42
}
fun main() { println(singleThreadValue) }

استخدام Lazy داخل فئة

تُهيّئ by lazy داخل فئة الخاصية عند أول وصول إليها، وهي مفيدة للحسابات المكلفة المرتبطة بحالة النسخة.

class DatabaseConnection(val url: String) {
    val pool: String by lazy {
        println("Connecting to $url")
        "Pool@$url"
    }
}
fun main() {
    val db = DatabaseConnection("localhost:5432")
    println(db.pool)
}

مقارنة Lazy بـ lateinit

استخدم by lazy مع val عندما تكون التهيئة معقدة. واستخدم lateinit مع var يتم تعيينه خارجيًا، مثلًا في الاختبارات أو حقن التبعيات.

class MyService {
    val computed: List<Int> by lazy { (1..100).toList() }
    lateinit var injected: String
}
fun main() {
    val s = MyService()
    s.injected = "injected value"
    println(s.computed.size)
    println(s.injected)
}

التحقق باستخدام isInitialized

تحقق مما إذا كانت الخاصية الكسولة قد هُيّئت باستخدام .isInitialized() — ولكن عبر مرجع المفوّض فقط.

val myLazy: String by lazy { "initialized" }
fun main() {
    val ref = ::myLazy
    // No direct isInitialized on val lazy, but we can check via delegate
    println(myLazy)
}

Lazy مع تبعية

يمكن للخصائص الكسولة أن تشير إلى خصائص كسولة أخرى، ما يتيح إنشاء سلسلة تهيئة كسولة.

val baseUrl: String by lazy { "https://api.example.com" }
val usersUrl: String by lazy { "$baseUrl/users" }
val postsUrl: String by lazy { "$baseUrl/posts" }
fun main() {
    println(usersUrl)
    println(postsUrl)
}

تطبيق عملي: خدمة مفردة

استخدم by lazy في تعريفات object لتهيئة الكائنات المفردة الثقيلة عند الطلب.

object Analytics {
    val client: String by lazy {
        println("Initializing analytics client")
        "AnalyticsClient@ready"
    }
}
fun main() {
    println("App started")
    println(Analytics.client) // initialized on first use
    println(Analytics.client) // cached
}

ترجمة Regex بشكل كسول

يُعد تجميع regex مكلفًا. استخدم by lazy لتجميعه مرة واحدة وإعادة استخدامه، وتجنّب الكلفة المتكررة.

val emailRegex: Regex by lazy {
    Regex("^[A-Za-z0-9+_.-]+@(.+)$")
}
fun isValidEmail(email: String) = emailRegex.matches(email)
fun main() {
    println(isValidEmail("user@example.com")) // true
    println(isValidEmail("bad-email"))         // false
}

اختبار سريع

أي وضع lazy ينبغي استخدامه في بيئة أحادية الخيط لتحقيق أعلى أداء؟

مراجعة

تشغّل by lazy لامبدا مرة واحدة عند أول وصول، ثم تخزّن النتيجة مؤقتًا. اختر SYNCHRONIZED (الافتراضي) لأمان مؤشرات الترابط، وPUBLICATION للتهيئة المتزامنة غير المتغيرة، وNONE لتحقيق الأداء في بيئة أحادية الخيط.

البدء مجانًا

تعلم Kotlin مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
51
الدروس
203

الأسئلة الشائعة

هل درس «‏by lazy: تعمّق في التهيئة المؤجلة» مجاني؟

نعم — نص درس «‏by lazy: تعمّق في التهيئة المؤجلة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏by lazy: تعمّق في التهيئة المؤجلة»؟

استكشف أوضاع التهيئة الكسولة: SYNCHRONIZED وPUBLICATION وNONE. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟

لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «‏by lazy: تعمّق في التهيئة المؤجلة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟

نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏by lazy: تعمّق في التهيئة المؤجلة
  2. مفوّضا observable وvetoable
  3. كتابة مفوّض ReadWriteProperty مخصص
  4. المفوّضات للتفضيلات والخصائص المدعومة بـ Map والتسجيل
← العودة إلى Kotlin Academy