مصفوفات الأوراق
لقد شاهدنا عدة أمثلة عن التركيب (القدرة على جمع عدة مقومات من اللغة في عدة ترتيبات متنوعة) حتى الآن. من الأمثلة الأولى التي شاهدناها كان استدعاء عملية ضمن عبارة حسابية. مثال آخر كان البنية المتداخلة للتعليمات: يمكنك وضع تعليمة if ضمن حلقة while، أو ضمن تعليمة if أخرى، الخ.
بعد أن شاهدت هذه الأشكال، ودرست المصفوفات والكائنات، لا يجب أن تفاجأ عندما تعلم أنك تستطيع عمل مصفوفات من الكائنات. وأنك تستطيع تعريف كائنات تحوي مصفوفات كمتغيرات حالة؛ يمكنك عمل مصفوفات تحتوي على مصفوفات؛ يمكنك تعريف كائنات تحتوي على كائنات، وهكذا. سنرى في الفصلين القادمين أمثلة عن هذه التراكيب باستخدام كائنات Card.
هذا المثال ينشئ مصفوفة من 52 ورقة:
كود:
Card[] cards = new Card [52];
هذا هو مخطط الحالة لهذا الكائن:
http://file.topmaxtech.net/images/ph...3961874041.jpg
تحتوي المصفوفة على مرجعيات للكائنات؛ ولا تحتوي على كائنات Card ذاتها. يتم تهيئة العناصر بالقيمة null. يمكنك الوصول إلى العناصر في المصفوفة بالطريقة المعتادة:
كود:
if (cards[0] == null) {
System.out.println("No cards yet!");
}
لكن إذا حاولت الولوج إلى متغير حالة لكائن Card غير موجود، ستحصل على NullPointerException.
كود:
cards[0].rank;             // NullPointerException
لكن هذه هي البنية الصحيحة للوصول إلى رتبة الورقة "الصفرية" من المجموعة. كما أن هذا مثال عن التركيب، يجمع البنية النحوية المستخدمة في الوصول إلى عنصر من مصفوفة ومتغير حالة في كائن.
أسهل طريقة لتعبئة مجموعة اللعب بكائنات Card هي كتابة حلقة متداخلة:
كود:
int index = 0;
for (int suit = 0; suit <= 3; suit++) {
for (int rank = 1; rank <= 13; rank++) {
cards[index] = new Card(suit, rank);
index++;
}
}
تعد الحلقة الخارجية الرتب من 0 إلى 3. ومن أجل لكل منظومة، تعد الحلقة الداخلية الرتب من 1 إلى 13. وبما أن الحلقة الخارجية تشتغل 4 مرات، والداخلية 13 مرة، فسيتم تنفيذ جسم الحلقة 52 مرة.
استخدمت index لمعرفة الموقع الذي يجب أن تذهب إليه الورقة التالية في مجموعة اللعب. يبين مخطط الحالة التالي شكل المجموعة بعد حجز أول ورقتين:
http://file.topmaxtech.net/images/ph...3961874052.jpg
تمرين 13.2
غلف شفرة بناء مجموعة ورق اللعب هذه في عملية باسم makeDeck لا تأخذ أية معاملات وتعيد مصفوفة أوراق ممتلئة بالكامل.