القيود
ما لا تستطيع فئات القيم فعله
القيود درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
معرفة الحدود
فئات القيم قوية، لكنها مقيّدة. يساعدك فهم حدودها على اختيار الأداة المناسبة وتجنب المفاجآت.
خاصية واحدة بالضبط
تغلف فئة القيمة قيمة واحدة. ولتجميع عدة حقول، تحتاج إلى فئة عادية أو data class.
// @JvmInline value class Range(val lo: Int, val hi: Int) // not allowed
data class Range(val lo: Int, val hi: Int)
fun main() {
println(Range(1, 10))
}لا حالة init تتجاوز القيمة
لا يمكن لفئات القيم امتلاك حقول خلفية غير خاصية المُنشئ الوحيدة. ولا يُسمح بحالة var إضافية لها حقل خلفي.
@JvmInline
value class Counter(val value: Int) {
// val cached: Int = value * 2 // not allowed: extra backing field
val doubled: Int get() = value * 2 // computed is fine
}
fun main() {
println(Counter(3).doubled)
}لا يوجد توريث
فئات القيم هي ضمنيًا final. ولا يمكنها التوسّع من فئات أخرى أو السماح بالتوسّع منها. ولا يجوز لها سوى تنفيذ الواجهات.
interface Named { val label: String }
@JvmInline
value class Tag(val text: String) : Named {
override val label: String get() = text
}
fun main() {
println(Tag("urgent").label)
}عودة تكلفة التغليف
يختفي الوعد بانعدام التكلفة عندما تُستخدم القيمة كنوع قابل للقيمة الفارغة أو كنوع عام أو كنوع واجهة. عندها يغلّفها المصرّف داخل كائن حقيقي.
@JvmInline
value class Id(val raw: Int)
fun main() {
val list: List<Id> = listOf(Id(1), Id(2)) // boxed inside the list
println(list.map { it.raw })
}لا توجد هوية
لا تمتلك فئات القيم هوية مرجعية ثابتة. فالمساواة المرجعية باستخدام === لا معنى لها، ولا يمكن استخدامها حيث تكون هوية الكائن مهمة، مثل قفل المزامنة.
@JvmInline
value class Code(val value: Int)
fun main() {
val a = Code(5)
val b = Code(5)
println(a == b) // structural equality works
}لا يمكن أن تكون lateinit أو مفوَّضة
لا يمكنك تطبيق lateinit على القيمة الأساسية، كما لا تدعم فئات القيم تفويض الخصائص في حقلها الوحيد. يجب تعيين القيمة في المُنشئ.
@JvmInline
value class Slug(val value: String)
fun main() {
val s = Slug("hello-world") // must be provided up front
println(s.value)
}تغيير أسماء JVM
على JVM، تحصل الدوال التي تأخذ معاملات من فئات القيم على أسماء مُغيَّرة في الرمز الثنائي لتجنب التعارضات. ويعقّد ذلك التكامل مع Java؛ فقد لا يراها مستدعو Java بصورة سليمة.
@JvmInline
value class Hz(val value: Int)
fun tune(freq: Hz) = freq.value
fun main() {
println(tune(Hz(440))) // simple from Kotlin; mangled from Java
}ليست للحاويات متعددة الحقول
إذا وجدت نفسك ترغب في خاصيتين، ففئة القيمة ليست الأداة المناسبة. استخدم data class بدلًا منها، واقبل التخصيص مقابل بنية أغنى.
data class Coordinate(val lat: Double, val lng: Double)
fun main() {
println(Coordinate(41.0, 29.0))
}ملخص القيود
لا يمكن لفئات القيم:
- احتواء أكثر من خاصية واحدة
- امتلاك حقول خلفية إضافية أو
lateinit - التوريث من الفئات أو السماح بالتوريث منها
- توفير هوية مرجعية
- تجنب التغليف دائمًا
الاختيار بحكمة
استخدم فئة قيمة لقيمة واحدة تم التحقق منها وآمنة نوعيًا. واستخدم فئة بيانات للبيانات المجمّعة. واستخدم اسمًا مستعارًا للنوع من أجل سهولة القراءة فقط، من دون أمان إضافي. لكل أداة موضعها.
اختبار سريع
اختبر فهمك لقيود فئات القيم.
مراجعة
لقد تعلّمت قيود فئات القيم:
- خاصية واحدة، ومن دون حقول خلفية إضافية
- لا توريث ولا هوية
- يعود التغليف عند الاستخدام كقيمة قابلة للقيمة الفارغة أو عامة أو كواجهة
- يعقّد تغيير أسماء JVM التكامل مع Java
طابق الأداة مع الحاجة.
الأسئلة الشائعة
هل درس «القيود» مجاني؟
نعم — نص درس «القيود» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «القيود»؟
ما لا تستطيع فئات القيم فعله تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «القيود»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.