0Pricing
Kotlin Academy · درس

فئات القيم المضمنة

غلّفوا القيم دون تكلفة إضافية

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

مشكلة التغليف

يضيف تغليف نوع بدائي داخل فئة أمانًا نوعيًا، لكنه يتكلف عادةً تخصيصًا على الكومة. توفر فئات القيم هذا الأمان، بينما يزيل المترجم الغلاف حيثما أمكن.

التصريح عن فئة قيمة

ضع علامة @JvmInline value class على فئة تحتوي على خاصية واحدة بالضبط في المُنشئ الأساسي. وهي تتصرف كنوع مميّز.

@JvmInline
value class Password(val value: String)

fun main() {
    val p = Password("secret")
    println(p.value)
}

نوع مميّز

بخلاف الاسم المستعار للنوع، تُعد فئة القيمة نوعًا منفصلًا. فلا يمكنك تمرير String خام بالخطأ عندما يكون المتوقَّع هو Password.

@JvmInline
value class Password(val value: String)

fun login(p: Password) = println("login with " + p.value)

fun main() {
    login(Password("hunter2"))
}

دون تكلفة إضافية

أثناء التشغيل، يضع المصرّف عادةً القيمة الأساسية ضمنيًا، لذلك لا يتم تخصيص كائن إضافي. وتمثَّل Password كسلسلة String عادية في معظم مسارات التنفيذ.

@JvmInline
value class Meters(val amount: Double)

fun main() {
    val d = Meters(5.0)
    println(d.amount) // stored inline as a Double
}

الأساليب والخصائص

يمكن لفئات القيم أن تحتوي على دوال وخصائص محسوبة، تمامًا مثل الفئات العادية.

@JvmInline
value class Celsius(val degrees: Double) {
    fun toFahrenheit() = degrees * 9 / 5 + 32
}

fun main() {
    println(Celsius(100.0).toFahrenheit())
}

كتل init للتحقق

تتيح لك كتلة init التحقق من القيمة المغلَّفة عند الإنشاء، مما يضمن صلاحية كل مثيل.

@JvmInline
value class Percentage(val value: Int) {
    init {
        require(value in 0..100) { "out of range" }
    }
}

fun main() {
    println(Percentage(75).value)
}

الخصائص المحسوبة

يمكنك إضافة خصائص محسوبة تُشتق من القيمة الوحيدة المخزَّنة، بحيث يبقى المنطق قريبًا من النوع.

@JvmInline
value class Seconds(val value: Int) {
    val asMinutes: Double get() = value / 60.0
}

fun main() {
    println(Seconds(120).asMinutes)
}

تنفيذ الواجهات

يمكن لفئات القيم تنفيذ الواجهات، مما يتيح استخدامها تعدديًا. ملاحظة: قد يؤدي ذلك إلى فرض التغليف عند التعامل معها باعتبارها نوع الواجهة.

interface Describable {
    fun describe(): String
}

@JvmInline
value class Money(val cents: Int) : Describable {
    override fun describe() = "$" + cents / 100.0
}

fun main() {
    println(Money(1599).describe())
}

متى يحدث التغليف

تظهر الحاوية مجددًا (التغليف) عندما تُستخدم القيمة كقيمة قابلة للقيمة الفارغة، أو كواجهة، أو ضمن مجموعة عامة. في هذه الحالات، ينشئ المصرّف كائنًا حقيقيًا — يظل ذلك صحيحًا، لكنه أقل كفاءة.

@JvmInline
value class Id(val raw: Int)

fun main() {
    val direct = Id(1)        // inlined
    val boxed: Id? = Id(2)    // boxed because nullable
    println("" + direct.raw + " " + boxed?.raw)
}

value مقابل data class

تُخصّص data class كائنًا دائمًا ويمكنها احتواء العديد من الخصائص. أما value class فتحتوي على خاصية واحدة بالضبط وتهدف إلى عدم إضافة أي تكلفة. اختر فئات القيم للحاويات الخفيفة والآمنة نوعيًا حول قيمة واحدة.

لماذا يهم ذلك

تتيح لك فئات القيم ما يلي:

  • منع الخلط بين المعاملات المتشابهة نوعيًا
  • إضافة التحقق إلى قيمة بدائية
  • تحمّل تكلفة تشغيلية معدومة عادةً

إنها الحل الآمن نوعيًا عندما لا تفي الأسماء المستعارة بالغرض.

اختبار سريع

اختبر فهمك لفئات القيم المضمّنة.

مراجعة

لقد تعلّمت فئات القيم المضمّنة:

  • تُصرَّح باستخدام @JvmInline value class مع خاصية واحدة
  • هي نوع مميّز دون تكلفة إضافية عادةً
  • تدعم الأساليب والخصائص المحسوبة والتحقق باستخدام init
  • يحدث التغليف عند استخدامها كقيمة قابلة للقيمة الفارغة أو عامة أو كواجهة

التالي: حالات الاستخدام الواقعية.

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

هل درس «فئات القيم المضمنة» مجاني؟

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

ماذا ستتعلم في «فئات القيم المضمنة»؟

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

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

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

كم من الوقت يستغرق درس «فئات القيم المضمنة»؟

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

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

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

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

  1. أسماء الأنواع المستعارة
  2. فئات القيم المضمنة
  3. حالات الاستخدام
  4. القيود
← العودة إلى Kotlin Academy