مقدمة: لماذا يعاني حتى مطوري Java المخضرمين من هذا السؤال؟
\n\nإذا كنت قد بحثت يومًا عن "How do I declare and initialize an array in Java?"، فأنت لست وحدك. هذا السؤال على Stack Overflow حصد مئات الآلاف من المشاهدات وما زال في ازدياد. قد يبدو الأمر بسيطًا، ولكن الشيطان يكمن في التفاصيل كما هو الحال دائمًا. Java هي لغة ذات كتابة صارمة، وبناء جملة المصفوفات فيها قد يربك المبتدئ.
\n\nفي هذه المقالة، سنستعرض جميع الطرق الممكنة للتصريح عن المصفوفات وتهيئتها في Java. ستتعرف على الفرق بين int[] arr و int arr[]، وكيفية إنشاء مصفوفات الكائنات بشكل صحيح، وكذلك كيفية تجنب الوقوع في فخ NullPointerException. هيا بنا!
1. الأساسيات: ما هي المصفوفة في Java؟
\n\nالمصفوفة في Java هي حاوية تخزن عددًا ثابتًا من العناصر من نفس النوع. على عكس Python أو JavaScript، حيث يمكن أن تكون المصفوفات ديناميكية، يتم تحديد حجم المصفوفة في Java عند الإنشاء ولا يمكن تغييره.
\n\nint[] numbers; // تصريح (declaration)\nnumbers = new int[5]; // تهيئة (initialization) — تخصيص ذاكرة لـ 5 عناصر\n\n\nفي السطر الأول، نخبر المترجم: "أريد إنشاء متغير سيشير إلى مصفوفة من الأعداد الصحيحة". في السطر الثاني، نخصص ذاكرة لـ 5 عناصر. فقط بعد ذلك تصبح المصفوفة جاهزة للاستخدام.
\n\n2. طرق التصريح عن المصفوفة
\n\nفي Java، يوجد بناءان جملة للتصريح عن المصفوفة. كلاهما صحيح، لكن مجتمع Java (والمعايير الرسمية لترميز Oracle) يوصي بالخيار الأول.
\n\nالطريقة 1: نوع البيانات + أقواس مربعة قبل اسم المتغير
\nint[] myArray;\nString[] names;\ndouble[] prices;\n\n\nالطريقة 2: أقواس مربعة بعد اسم المتغير (نمط C/C++)
\nint myArray[];\nString names[];\ndouble prices[];\n\n\nأيهما تختار؟ الخيار الأول يُقرأ بشكل أكثر طبيعية: int[] myArray — "مصفوفة أعداد صحيحة باسم myArray". الخيار الثاني قد يكون مربكًا، خاصة عند التصريح عن عدة متغيرات في سطر واحد:
int[] arr1, arr2; // كلا المتغيرين مصفوفات\nint arr3[], arr4; // arr3 مصفوفة، arr4 عدد صحيح عادي (خطأ!)\n\n\nلذلك، استخدم دائمًا نوع[] اسم.
3. تهيئة المصفوفة: 4 طرق مثبتة
\n\nبعد التصريح، يجب تهيئة المصفوفة. إليك كيفية القيام بذلك بشكل صحيح.
\n\nالطريقة 1: إنشاء مصفوفة فارغة مع تحديد الحجم
\nint[] numbers = new int[10]; // مصفوفة من 10 عناصر، جميعها تساوي 0 (افتراضيًا)\nString[] words = new String[5]; // مصفوفة من 5 سلاسل، جميعها تساوي null\n\n\nهذه الطريقة مناسبة إذا كنت تخطط لملء المصفوفة لاحقًا (مثلًا في حلقة). من المهم التذكر: للأنواع الرقمية، القيم الافتراضية هي 0، لـ boolean — false، للأنواع المرجعية — null.
الطريقة 2: التهيئة باستخدام حرفية المصفوفة
\nint[] numbers = {1, 2, 3, 4, 5};\nString[] fruits = {"apple", "banana", "orange"};\n\n\nهذه هي الطريقة الأقصر والأكثر ملاءمة عندما تعرف جميع العناصر مسبقًا. لاحظ: هذا البناء يعمل فقط عند التصريح.
\n\nالطريقة 3: مصفوفة مجهولة (بدون اسم متغير)
\nint[] numbers = new int[]{1, 2, 3, 4, 5};\n\n\nهذا الخيار مفيد عندما تحتاج إلى تمرير مصفوفة إلى دالة دون إنشاء متغير منفصل:
\n\nprintArray(new int[]{10, 20, 30});\n\n\nالطريقة 4: التهيئة عبر حلقة
\nint[] squares = new int[10];\nfor (int i = 0; i < squares.length; i++) {\n squares[i] = (i + 1) * (i + 1);\n}\n\n\nمثالية للتعبئة الديناميكية، مثل حساب القيم أو قراءة البيانات من ملف.
\n\n