Menu
CoddyTech

الدوال العامة (Generic Methods)

جزء من قسم البرمجة كائنية التوجه في رحلة Java على Coddy. الدرس 55 من 87.

بينما تتيح الفئات العامة للفئات بأكملها العمل مع أنواع مختلفة، قد تحتاج أحيانًا إلى جعل طريقة واحدة فقط عامة. تعرّف الطريقة العامة معامل النوع الخاص بها، مستقلًا عن أي أنواع عامة على مستوى الفئة.

يظهر مُعامل النوع قبل نوع القيمة المُعادة في توقيع الطريقة:

public class Utility {
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.println(element);
        }
    }
}

String[] names = {"Alice", "Bob"};
Integer[] numbers = {1, 2, 3};

Utility.printArray(names);    // يعمل مع String[]
Utility.printArray(numbers);  // يعمل مع Integer[]

لاحظ <T> الموضوعة بين المعدِّلات ونوع القيمة المُعادة. هذا يعرّف T على أنه وسيط نوع لهذه الدالة تحديدًا. يستنتج المُصرِّف النوع الفعلي من الوسائط التي تمرّرها.

يمكن للطرق العامة أيضًا أن تُعيد النوع العام:

public static <T> T getFirst(T[] array) {
    if (array.length > 0) {
        return array[0];
    }
    return null;
}

String first = getFirst(new String[]{"a", "b"});  // تُرجع "a"

يمكنك استخدام عدة معلمات للنوع عند الحاجة:

public static <K, V> void printPair(K key, V value) {
    System.out.println(key + ": " + value);
}

printPair("Age", 25);        // String وInteger
printPair(1, "First");       // Integer وString

تكون الأساليب العامة مفيدة بشكل خاص في فئات الأدوات، حيث تحتاج إلى عمليات مرنة وقابلة لإعادة الاستخدام دون إنشاء فئة عامة.

challenge icon

التحدي

سهل

لنبنِ مجموعة أدوات مساعدة تُبرز مرونة الأساليب العامة. ستنشئ صنفًا يضم أساليب قابلة لإعادة الاستخدام تعمل مع أي نوع، لتوضيح كيف يمكن للأساليب العامة أن توجد بصورة مستقلة عن الأصناف العامة.

ستنظّم التعليمات البرمجية في ملفين:

  • ArrayUtils.java: أنشئ صنفًا للأدوات المساعدة يحتوي على أساليب عامة للعمل مع المصفوفات. يجب أن يحتوي صنفك على ثلاثة أساليب عامة ثابتة:

    getLast - أسلوب عام يأخذ مصفوفة من النوع T ويعيد العنصر الأخير. إذا كانت المصفوفة فارغة، فأعِد null.

    swap - أسلوب عام يأخذ مصفوفة من النوع T وفهرسين صحيحين، ثم يبدّل العنصرين في هذين الموضعين. لا يعيد هذا الأسلوب أي شيء.

    printWithLabel - أسلوب عام له معاملان للنوع، هما K وV. يأخذ تسمية من النوع K وقيمة من النوع V، ثم يطبعهما بالتنسيق: [label]: [value]

  • Main.java: استخدم أساليبك العامة! ستتلقى أربعة مدخلات: كلمتين (سلسلتي نص) ورقمين (عددين صحيحين).

    أولًا، أنشئ مصفوفة String[] تحتوي على الكلمتين. استخدم getLast للحصول على العنصر الأخير واطبعه: Last word: [result]

    بعد ذلك، أنشئ مصفوفة Integer[] تحتوي على الرقمين. استدعِ swap لتبديل العنصرين عند الفهرسين 0 و1، ثم اطبع: After swap: [first], [second]

    أخيرًا، وضّح الأسلوب العام ذي المعاملين باستدعاء printWithLabel مرتين:

    • مرةً مع استخدام الكلمة الأولى كتسمية والرقم الأول كقيمة
    • ومرةً مع استخدام الرقم الأول كتسمية والكلمة الثانية كقيمة

ستتلقى أربعة مدخلات بهذا الترتيب: الكلمة الأولى، الكلمة الثانية، الرقم الأول، الرقم الثاني.

لاحظ كيف يعلن كل أسلوب عن معامل النوع الخاص به (أو معاملاته) باستخدام <T> أو <K, V> قبل نوع الإرجاع. يستنتج المصرّف الأنواع الفعلية من الوسائط التي تمرّرها؛ فلا حاجة إلى تحديدها صراحةً عند استدعاء الأساليب!

جرّب بنفسك

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // اقرأ المدخلات
        String firstWord = scanner.nextLine();
        String secondWord = scanner.nextLine();
        int firstNumber = scanner.nextInt();
        int secondNumber = scanner.nextInt();
        
        // TODO: أنشئ مصفوفة String[] تحتوي على الكلمتين
        
        // TODO: استخدم ArrayUtils.getLast للحصول على العنصر الأخير
        // اطبع: "Last word: [result]"
        
        // TODO: أنشئ مصفوفة Integer[] تحتوي على العددين
        
        // TODO: استدعِ ArrayUtils.swap لتبديل العنصرين عند الفهرسين 0 و1
        // اطبع: "After swap: [first], [second]"
        
        // TODO: استدعِ ArrayUtils.printWithLabel باستخدام firstWord كتسمية وfirstNumber كقيمة
        
        // TODO: استدعِ ArrayUtils.printWithLabel باستخدام firstNumber كتسمية وsecondWord كقيمة
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Java عبر الإنترنت