Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - الحاويات العامة

جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 58 من 87.

challenge icon

التحدي

سهل

لنقم ببناء نظام تخزين متعدد الاستخدامات يجمع كل ما تعلمته عن الأنواع العامة (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