مراجعة - الحاويات العامة
جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 58 من 87.
التحدي
سهللنقم ببناء نظام تخزين متعدد الاستخدامات يجمع كل ما تعلمته عن الأنواع العامة (generics)! ستقوم بإنشاء فئة Container يمكنها تخزين العناصر من أي نوع واسترجاعها ومعالجتها، بالإضافة إلى طرق (utility methods) توضح استخدام الرموز العامة (wildcards) بشكل عملي.
ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:
Container.java: قم بإنشاء فئة عامةContainer<T>تدير مجموعة من العناصر. يجب أن تستخدم الحاوية الخاصة بكArrayList<T>داخلياً لتخزين العناصر. قم بتضمين طرق لـadd(T item)لإضافة عنصر، وget(int index)لاسترجاع عنصر في موضع معين، وsize()لإرجاع عدد العناصر، وisEmpty()للتحقق مما إذا كانت الحاوية لا تحتوي على عناصر. أضف أيضاً طريقةgetAll()التي تعيد القائمة الداخلية.ContainerUtils.java: قم بإنشاء فئة أدوات (utility class) تحتوي على طرق عامة ثابتة (static generic methods) تعمل مع الحاويات الخاصة بك:printAll(Container<?> container)- تستخدم رمزاً عاماً غير محدود (unbounded wildcard) لطباعة جميع العناصر في أي حاوية، عنصراً واحداً في كل سطر.countItems(Container<? extends Number> container)- تستخدم رمزاً عاماً محدوداً من الأعلى (upper bounded wildcard) لحساب مجموع كل القيم الرقمية في الحاوية، مع إرجاع النتيجة كـdouble.addDefaults(Container<? super Integer> container)- تستخدم رمزاً عاماً محدوداً من الأسفل (lower bounded wildcard) لإضافة الأعداد الصحيحة 1 و 2 و 3 إلى أي حاوية يمكنها استيعاب الأعداد الصحيحة.<T> T getLastOrDefault(Container<T> container, T defaultValue)- طريقة عامة تعيد العنصر الأخير في الحاوية، أو القيمة الافتراضية إذا كانت الحاوية فارغة.Main.java: اجمع نظام الحاوية العام الخاص بك معاً! ستتلقى ثلاثة مدخلات: كلمة (String)، وعدد صحيح (integer)، وعدد عشري (double).أولاً، قم بإنشاء
Container<String>وأضف الكلمة إليه مرتين. اطبعString container:ثم استخدمprintAllلعرض محتوياته.بعد ذلك، قم بإنشاء
Container<Double>وأضف القيمة العشرية إليه. اطبع سطراً فارغاً، ثمNumber sum: [sum]باستخدامcountItems.ثم قم بإنشاء
Container<Number>واستدعِaddDefaultsعليه. اطبع سطراً فارغاً، ثمAfter adding defaults:واستخدمprintAllلإظهار المحتويات.أخيراً، قم بإنشاء
Container<Integer>فارغ واستخدمgetLastOrDefaultمع مدخل العدد الصحيح كقيمة افتراضية. اطبع سطراً فارغاً، ثمLast or default: [result].
ستتلقى ثلاثة مدخلات بالترتيب: كلمة (String)، وعدد صحيح (integer)، وعدد عشري (double).
يجمع هذا التحدي بين الفئات العامة، والطرق العامة، ومعلمات الأنواع المحدودة، وجميع أنواع الرموز العامة الثلاثة. لاحظ كيف يخدم كل جزء غرضاً مختلفاً: توفر الفئة العامة تخزيناً آمناً للأنواع، وتمكن الرموز العامة المحدودة من القراءة والكتابة المرنة، وتقدم الطرق العامة عمليات قابلة لإعادة الاستخدام عبر أنواع الحاويات المختلفة!
جرّب بنفسك
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// قراءة المدخلات
String word = scanner.nextLine();
int intValue = Integer.parseInt(scanner.nextLine());
double doubleValue = Double.parseDouble(scanner.nextLine());
// TODO: قم بإنشاء Container<String> وأضف الكلمة مرتين
// اطبع "String container:" ثم استخدم ContainerUtils.printAll()
// TODO: قم بإنشاء Container<Double> وأضف قيمة double
// اطبع سطراً فارغاً، ثم "Number sum: [sum]" باستخدام ContainerUtils.countItems()
// TODO: قم بإنشاء Container<Number> واستدعِ ContainerUtils.addDefaults() عليه
// اطبع سطراً فارغاً، ثم "After adding defaults:" واستخدم ContainerUtils.printAll()
// TODO: قم بإنشاء Container<Integer> فارغ
// استخدم ContainerUtils.getLastOrDefault() مع intValue كقيمة افتراضية
// اطبع سطراً فارغاً، ثم "Last or default: [result]"
}
}
جميع دروس Object Oriented Programming
1أساسيات الـ OOP
الملفات الخارجيةمقدمة في الـ OOPالفئات (Classes) مقابل الكائنات (Objects)الكلمة المفتاحية thisالدوال (Methods)الحقول (Attributes)دالة البناء (Constructor)تعدد أشكال دالة البناء (Constructor Overloading)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسية (extends)الكلمة المفتاحية superإعادة تعريف الدوال (@Override)تسلسل المنشئات (Constructor Chaining)كلاس Objectالوراثة الأحادية ومتعددة المستوياتلماذا لا توجد وراثة متعددة للكلاساتمراجعة - هيكلية الموظفين7الدوال الخاصة وفئة Object
دالة toString()equals() و hashCode()دالة clone()compareTo() و Comparableواجهة Comparatorمراجعة - الترتيب المخصص2محددات الوصول والتغليف
نظرة عامة على مستويات الوصولدوال Getter و Setterإخفاء البياناتالكلمة المفتاحية finalمراجعة - مدير الحساب البنكي5تعدد الأشكال (Polymorphism)
أساسيات الـ Method Overloadingالـ Method Overriding (في وقت التشغيل)الـ Upcasting والـ Downcastingمعامل الـ instanceofالفئات والدوال المجردة (Abstract)مراجعة - حاسبة الأشكال8مفاهيم OOP المتقدمة
الـ Composition مقابل الـ Inheritanceالـ Aggregation مقابل الـ Compositionالفئات الداخلية والمتداخلة والمجهولة (Inner, Nested & Anonymous)الـ Enums ودوالهاالـ Records (Java 16+)الـ Sealed Classes (Java 17+)11أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factoryنمط Builderنمط Observerنمط Strategy3خصائص الفئة والعضو الساكن
المتغيرات الخاصة بالكائن مقابل المتغيرات الساكنةالدوال الساكنةالكتل البرمجية الساكنةالثوابت (static final)ملخص - العداد والأدوات المساعدة6الواجهات (Interfaces) والأصناف المجردة (Abstract Classes)
مقدمة في الواجهات (Interfaces)تنفيذ الواجهات (Interfaces)تنفيذ واجهات متعددةالـ Default و Static في الواجهاتالأصناف المجردة مقابل الواجهاتالواجهات الوظيفية (Functional Interfaces)مراجعة - نظام الدفع9الأنواع العامة (Generics)
مقدمة في الأنواع العامةالأصناف العامة (Generic Classes)الدوال العامة (Generic Methods)معاملات الأنواع المقيدةالرموز البديلة (?, extends, super)مراجعة - الحاويات العامة12أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكرر