لغة Kotlin، بصفتها لغة برمجة ذات أنواع ثابتة، تقوم بمعظم عمليات التحقق من الأنواع أثناء عملية التجميع. ومع ذلك، تنشأ بعض الحالات التي يكون فيها التحقق من نوع وقت التشغيل ضروريًا للسلوك الديناميكي أو معالجة الأخطاء القوية. تتناول هذه المقالة طريقتين فعالتين لتحديد نوع متغير Kotlin وقت التشغيل.
محتويات الجدول
استخدام كلمة المفتاح is
توفر كلمة المفتاح is
النهج الأكثر مباشرة وفعالية للتحقق من نوع وقت التشغيل. فهي تُرجع true
إذا كان المتغير من النوع المحدد أو نوع فرعي منه، و false
بخلاف ذلك. هذا يُسهّل المنطق الشرطي بناءً على نوع المتغير.
fun checkTypeWithIs(variable: Any) {
when (variable) {
is String -> println("المتغير هو سلسلة نصية: $variable")
is Int -> println("المتغير هو عدد صحيح: $variable")
is Double -> println("المتغير هو عدد عشري: $variable")
else -> println("المتغير من نوع غير معروف: ${variable?.javaClass?.name ?: "null"}")
}
}
fun main() {
val myString = "Hello, Kotlin!"
val myInt = 10
val myDouble = 3.14
val myNull: String? = null
checkTypeWithIs(myString) // الإخراج: المتغير هو سلسلة نصية: Hello, Kotlin!
checkTypeWithIs(myInt) // الإخراج: المتغير هو عدد صحيح: 10
checkTypeWithIs(myDouble) // الإخراج: المتغير هو عدد عشري: 3.14
checkTypeWithIs(myNull) // الإخراج: المتغير من نوع غير معروف: null
}
يستخدم هذا المثال المحسّن تعبير when
لكتابة أكثر وضوحًا ويعالج قيم null
بشكل أنيق. ومن المهم أن عمليات الإرسال الذكية في Kotlin تلغي الحاجة إلى الإرسال الصريح داخل فروع when
. بعد التحقق الناجح من is
، يتم التعامل مع المتغير تلقائيًا على أنه النوع الذي تم التحقق منه.
استخدام خاصية qualifiedName
توفر هذه الطريقة نهجًا برمجيًا أكثر، وهو مثالي عندما تحتاج إلى اسم النوع كسلسلة نصية. فهي تستخدم خاصية ::class
وخاصية qualifiedName
من مثيل KClass
الناتج.
fun checkTypeWithQualifiedName(variable: Any) {
val typeName = variable::class.qualifiedName ?: "نوع غير معروف"
println("نوع المتغير هو: $typeName")
}
fun main() {
val myString = "Hello, Kotlin!"
val myInt = 10
val myList = listOf(1, 2, 3)
val myNull: String? = null
checkTypeWithQualifiedName(myString) // الإخراج: نوع المتغير هو: kotlin.String
checkTypeWithQualifiedName(myInt) // الإخراج: نوع المتغير هو: kotlin.Int
checkTypeWithQualifiedName(myList) // الإخراج: نوع المتغير هو: kotlin.collections.List
checkTypeWithQualifiedName(myNull) // الإخراج: نوع المتغير هو: kotlin.String
}
يشمل هذا المثال المُحسّن سلامة قيم null باستخدام عامل Elvis (?:) للتعامل مع قيم null المحتملة بشكل أكثر قوة. يتم إرجاع الاسم المؤهل بالكامل، وهو مفيد للتسجيل أو تصحيح الأخطاء أو معالجة الأنواع الديناميكية بناءً على التمثيل النصي. ومع ذلك، بالنسبة للتحقق من الأنواع البسيطة، تظل كلمة المفتاح is
أكثر كفاءة.
باختصار، توفر كلتا الطريقتين طرقًا قيّمة لتحديد نوع المتغير وقت التشغيل. تتميز كلمة المفتاح is
في المنطق الشرطي، بينما تتألق qualifiedName
في السيناريوهات البرمجية التي تتطلب أسماء الأنواع كسلاسل نصية. يعتمد اختيار الطريقة الصحيحة على احتياجات تطبيقك المحددة.