مقدمة: مفارقة القائمة الفارغة في Kotlin
\n\nتخيل: أنت تكتب بلغة Kotlin، وتحتاج إلى إنشاء قائمة سيتم ملؤها ديناميكيًا. أنت تعلم أن List هي مجموعة غير قابلة للتغيير، وأن MutableList هي ما يصفه الطبيب. ولكن بمجرد كتابة val list = MutableList()، يظهر خطأ من المترجم. هل هذا مألوف؟
هذا السؤال هو من أكثر الأسئلة شيوعًا على Stack Overflow بين المبتدئين في Kotlin (وليس فقط). آلاف المطورين يتعثرون بنفس المشكلة: كيف نهيئ MutableList فارغة بشكل صحيح؟ قد تبدو تفصيلة صغيرة، لكن بدونها لا تعمل أي خوارزمية ديناميكية.
في هذه المقالة، سنستعرض جميع الطرق القانونية لإنشاء قائمة قابلة للتغيير فارغة في Kotlin. من الحيل البسيطة إلى التقنيات المتقدمة. ستتعرف لماذا mutableListOf() هو أفضل صديق لك، و ArrayList() هو الرفيق القديم الموثوق. هيا بنا!
1. لماذا لا يعمل MutableList() ببساطة؟
\n\nدعنا نبدد الأسطورة فورًا. إذا حاولت كتابة:
\n\n// خطأ في الترجمة!\nval list = MutableList()\n\nسيحتج المترجم بحق. لماذا؟ لأن MutableList هي واجهة (interface) وليست فئة محددة. لا يمكن إنشاء كائن من واجهة. الأمر يشبه محاولة إنشاء "سيارة فقط" دون تحديد الماركة والموديل. Kotlin يتطلب تنفيذًا محددًا.
لحسن الحظ، لدينا عدة طرق أنيقة لتجاوز هذا القيد.
\n\n2. أسهل طريقة: mutableListOf()
\n\nهذه هي ملكة القوائم الفارغة. دالة مصنع قياسية من المكتبة القياسية لـ Kotlin:
\n\nval emptyList = mutableListOf<String>()\nprintln(emptyList) // الإخراج: []\nprintln(emptyList.size) // الإخراج: 0\n\nلماذا هذا رائع:
\n- \n
- لا حاجة لتحديد النوع إذا كان يمكن استنتاجه من السياق \n
- تنشئ
MutableListمن نوعArrayListتحت الغطاء \n - تُقرأ كـ "أنشئ لي قائمة قابلة للتغيير من لا شيء" \n
إضافة العناصر متعة:
\n\nval numbers = mutableListOf<Int>()\nnumbers.add(1)\nnumbers.add(2)\nnumbers.add(3)\nprintln(numbers) // [1, 2, 3]\n\nهذه الطريقة مناسبة لـ 90% من الحالات. احفظها كطريقة أساسية.
\n\n3. الطريقة الكلاسيكية ArrayList() — عودة الملك
\n\nإذا أتيت من Java، ستبدو لك هذه الطريقة مألوفة. Kotlin متوافق تمامًا مع Java Collections Framework، لذا يمكنك استخدام ArrayList مباشرة:
val list = ArrayList<String>()\nprintln(list) // []\n\nلكن هناك فارق: ArrayList هو تنفيذ محدد لواجهة MutableList. إذا أردت لاحقًا تغيير التنفيذ (مثلاً إلى LinkedList)، ستحتاج لتغيير نوع المتغير. بهذا المعنى، mutableListOf() أكثر مرونة لأنه يُرجع MutableList.
متى تستخدم ArrayList():
\n- \n
- عند الحاجة إلى أقصى أداء (ArrayList أسرع من LinkedList للوصول حسب الفهرس) \n
- عند العمل مع مكتبات Java التي تتوقع ArrayList تحديدًا \n
- عند اختيار تنفيذ محدد بوعي \n
4. الطريقة الذكية: MutableList(size) { defaultValue }
\n\nأحيانًا القائمة الفارغة ليست "فارغة" تمامًا. قد تحتاج لإنشاء قائمة بحجم معروف مسبقًا ولكن بقيم فارغة. لهذا يوجد تحميل زائد للمُنشئ:
\n\n// إنشاء قائمة من 5 عناصر، كل منها سلسلة فارغة\nval list = MutableList(5) { "" }\nprintln(list) // [, , , , ]\nprintln(list.size) // 5\n\nهذه ليست قائمة فارغة تمامًا، لكنها قائمة مهيأة بقيم "فارغة". مفيدة عندما تعرف عدد العناصر بالضبط ولكنك ستقوم بإعادة كتابتها.
\n\nللحصول على صفر تام، استخدم
المدونات
توصيات الكتب
اقرأ أيضًا