من Java String[] إلى Kotlin: دليل شامل للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا يزعج هذا السؤال كل من ينتقل من Java إلى Kotlin

\n\n

هل بدأت للتو في تعلم Kotlin بعد Java وواجهت أول مفاجأة؟ هل تحاول تعريف مصفوفة من السلاسل النصية كما اعتدت في Java — String[] names = {"Alice", "Bob"} — ويصدر مترجم Kotlin خطأ؟ تهانينا، أنت لست وحدك. السؤال "ما هو ما يعادل Kotlin لـ Java String[]؟" حصد آلاف المشاهدات على Stack Overflow، وهذا ليس من قبيل الصدفة.

\n\n

Kotlin ليست مجرد "Java مع سكر". تقدمها Google كلغة أكثر حداثة وأمانًا وإيجازًا. لكن هذا الإيجاز أحيانًا يربك المبتدئين. في Java، المصفوفة هي بنية مدمجة في اللغة. في Kotlin، المصفوفات هي جزء من المكتبة القياسية، ولها خصائصها الخاصة.

\n\n

في هذه المقالة، سنشرح كل ما تحتاج معرفته عن مصفوفات السلاسل النصية في Kotlin. ستتعلم ليس فقط المكافئ المباشر لـ String[]، بل أيضًا بدائل أكثر مرونة تجعل كودك أنظف وأكثر أمانًا. هيا بنا!

\n\n

1. المكافئ المباشر: Array<String>

\n\n

أبسط وأوضح طريقة لاستبدال String[] في Kotlin هي استخدام Array<String>. في Kotlin، جميع المصفوفات هي كائنات من الفئة Array<T>، حيث T هو نوع العناصر.

\n\n

كيفية التعريف والتهيئة؟

\n\n

في Java تكتب:

\n
String[] names = new String[3];\nnames[0] = "Alice";\nnames[1] = "Bob";\nnames[2] = "Charlie";
\n\n

في Kotlin يبدو الأمر هكذا:

\n
val names: Array<String> = arrayOfNulls(3)\nnames[0] = "Alice"\nnames[1] = "Bob"\nnames[2] = "Charlie"
\n\n

لكن هناك طريقة أقصر بكثير — استخدام الدالة arrayOf():

\n
val names = arrayOf("Alice", "Bob", "Charlie")
\n\n

سيستنتج مترجم Kotlin النوع Array<String> تلقائيًا. لاحظ: على عكس Java، في Kotlin لا يوجد عامل new لإنشاء المصفوفات. بدلاً من ذلك، تُستخدم دوال المصنع (factory functions).

\n\n

فرق مهم: حجم ثابت

\n\n

كما في Java، حجم Array<String> ثابت. لا يمكنك إضافة عنصر جديد بعد الإنشاء. إذا حاولت الوصول إلى فهرس خارج الطول، ستحصل على ArrayIndexOutOfBoundsException.

\n\n
val fruits = arrayOf("Apple", "Banana")\n// fruits[2] = "Cherry" // خطأ! الفهرس خارج الحدود
\n\n

2. المصفوفات المتخصصة: ليس دائمًا Array<String>

\n\n

للأنواع البدائية (Int, Double, Boolean) تقدم Kotlin فئات محسّنة: IntArray و DoubleArray و BooleanArray إلخ. لا تستخدم هذه الفئات التغليف التلقائي (boxing/unboxing)، مما يوفر الذاكرة ويسرع التنفيذ.

\n\n

لكن بالنسبة للسلاسل النصية لا يوجد مثل هذا التحسين، لأن String هو نوع مرجعي وليس بدائيًا. لذلك Array<String> هو الخيار الوحيد إذا كنت بحاجة إلى مصفوفة.

\n\n

3. البديل رقم 1: List<String> (قائمة غير قابلة للتغيير)

\n\n

في معظم الحالات، لا تحتاج إلى مصفوفة. في Kotlin، يُوصى بشدة باستخدام القوائم بدلاً من المصفوفات، إلا إذا كنت تعمل مع كود منخفض المستوى (مثل JNI أو تحسين الأداء على مستوى النانو ثانية).

\n\n

القائمة List<String> هي مجموعة غير قابلة للتغيير. لا يمكنك تغيير حجمها أو عناصرها بعد الإنشاء. وهذا يجعل الكود أكثر أمانًا في البيئات متعددة الخيوط.

\n\n
val namesList: List<String> = listOf("Alice", "Bob", "Charlie")\n// namesList[0] = "Eve" // خطأ! listOf تُرجع قائمة غير قابلة للتغيير
\n\n

في جوهرها، listOf هي ما يعادل Kotlin لـ Java String[] مع حماية إضافية. في Java، يمكن تغيير المصفوفة عن طريق الخطأ عند تمريرها إلى دالة أخرى. في Kotlin، List لا يسمح بذلك.

\n\n

4. بد

المدونات

توصيات الكتب