Javaمفهوم التعميم في جافا
- مفهوم التعميم
- الأحرف المستخدمة في التعميم
- المبادئ الأساسية التي عليك إتباعها عند التعامل مع التعميم
- أمثلة شاملة حول التعامل مع التعميم
مفهوم التعميم
في الدرسين السابقين تعرفنا على كلاسات الـ Data Structure التي تسمح لنا بتخزين البيانات مهما كان نوعهم و بأشكال مختلفة أثناء تشغيل البرنامج.
عند استخدام هذه الكلاسات كنا نلاحظ أنه بإمكاننا تخزين أي نوع بيانات فيهم بدون أي مشاكل.
أسلوب التعميم ( Generics ) يجعلك قادراً على بناء كود واحد يلائم أكثر من نوع بيانات, و عند الحاجة إلى استخدام هذا الكود يمكنك إستخدامه كما هو, و يمكنك أيضاً تحديد نوع البيانات التي تريده أن يعمل معها حسب حاجتك.
في الدرس السابق شرحنا كيف يمكن تخزين أي نوع بيانات في الكلاسات ArrayList
و LinkedList
, و تعلمنا أيضاً كيف أننا نستطيع تحديد نوع البيانات التي نريد تخزينها فيهم في حال استخدمنا أسلوب التعميم عند إنشاء كائنات منهم.
معلومة تقنية
فعلياً, معظم كلاسات الـ Data Structure تم بناءها على أساس هذا الأسلوب.
كل كلاس, إنترفيس أو دالة تجد الرمز < >
موجود ضمن تعريفه, إعرف مباشرةً أنه مصمم للتعامل مع أكثر من نوع بيانات.
فائدة التعميم
أنت لست مجبر على استخدام أسلوب التعميم, لكن تعلمه سيفيدك كثيراً في تطوير الكود الخاص فيك, و جعل حجمه أصغر و أسهل في حالة التعديل.
فمثلاً, إن كنت بحاجة إلى بناء مصفوفة ليس لها حجم محدد و تريد تخزين أعداد صحيحة ( أي من النوع int
) فقط فيها, يمكنك إنشاء كائن من الكلاس ArrayList
و تحديد النوع Integer
كنوع البيانات الوحيد الذي يمكن إدخاله في هذا الكائن كما رأينا في الدرس السابق و تكون بهذا قد وصلت لهدفك بكل سهولة بواسطة أسلوب التعميم.
ميزة أخرى مهمة جدًا في هذا الأسلوب, و هي أنه يساعد المبرمج في إكتشاف الأخطاء النوعية أثناء كتابة الكود.
مثلاً, إذا قمت بإنشاء كائن نوعه ArrayList
و حددت أنه يمكنه تخزين قيم من النوع Integer
فقط, بعدها حاولت تخزين قيمة من نوع آخر مثل النوع String
على سبيل المثال, عندها سيظهر لك تحذير مفاده أنه لا يمكن تحويل النوع String
إلى النوع Integer
.
خلاصة
بشكل عام, نستخدم التعميم لبناء كود يتوافق مع أي نوع بيانات.
عند الحاجة إلى هذا الكود نقوم بتحديد نوع البيانات التي سنتعامل معها. ستفهم كل شيء من الأمثلة.
ستتعلم في هذا الدرس كيف تعرف أي شيء كـ Generic و كيف تستفيد منه, و تذكر أنه يمكنك استخدام هذا الأسلوب مع أغلب كلاسات الـ Data Structure.
الأحرف المستخدمة في التعميم
ذكرنا في الجدول التالي الأحرف المتعارف عليها بين المبرمجين عند التعامل مع التعميم .
الأحرف المتعارف عليها في التعميم | |
---|---|
T |
إختصار للكلمة Type, يقصد منه أي نوع كان. نستخدمه في العادة عند بناء كود يتعامل مع أي نوع بيانات. |
N |
إختصار للكلمة Number, يقصد منه أي نوع من الأنواع التي تستخدم لتخزين الأرقام. نستخدمه في العادة عند بناء كود يتعامل مع الأرقام من أي نوع كانت مثل ( Integer - Float - Double إلخ.. ). |
E |
إختصار للكلمة Element, يقصد منه عنصر ليس له نوع محدد. نستخدمه في العادة عند بناء كود يتعامل مع عناصر المصفوفة من أي نوع كانت. |
K |
إختصار للكلمة Key, يقصد منه مفتاح ليس له نوع محدد. نستخدمه في العادة عند بناء كود يتعامل مع مفاتيح كائن يخزن البيانات بشكل key / value. |
V |
إختصار للكلمة Value, يقصد منه قيمة ليس لها نوع محدد. نستخدمه في العادة عند بناء كود يتعامل مع قيم كائن يخزن البيانات بشكل key / value. |
ملاحظة: جميع الأحرف المذكورة في الجدول ليس لها أي تأثير على الكود و يمكنك وضع أي حرف أو كلمة مكانهم, لكننا ننصحك باعتمادهم.
المبادئ الأساسية التي عليك إتباعها عند التعامل مع التعميم
لتعريف متغير, مصفوفة أو دالة بدون تحديد نوعهم, أي ليعملوا مع مختلف أنواع البيانات, يجب تعريفهم بشكل مجرد.
هنا وضعنا أمثلة صغيرة الهدف منها توضيح طريقة استخدام الأحرف التي ذكرناها في الجدول السابق من أجل تعريف كود يمكن استخدامه للتعامل مع أكثر من نوع بيانات.
في نهاية الدرس وضعنا أمثلة مهمة توضح أهمية و طريقة استخدام التعميم.
طريقة تعريف نوع بيانات مجهول
لتجهيز نوع بيانات غير محدد يمكن استخدامه في كلاس أو إنترفيس أو دالة, نضع أحد الأحرف التي ذكرناها في الجدول السابق بين < >
عند تعريفهم.
أمثلة
هنا قمنا بتعريف كلاس إسمه GenericClass
يملك نوع بيانات غير محدد رمزنا له بـ T.
public class GenericClass <T> { }
هنا قمنا بتعريف إنترفيس إسمه GenericInterface
يملك نوع بيانات غير محدد رمزنا له بحرف N.
public interface GenericInterface <N> { }
هنا قمنا بتعريف دالة إسمها genericMethod
تملك نوع بيانات غير محدد رمزنا له بحرف E.
public <E> void genericMethod(E var) { System.out.println(var); }
طريقة تعريف أكثر من نوع بيانات مجهول
نفس الطريقة السابقة, لكن يجب وضع فاصلة بين كل حرفين تم استخدامها بداخل الرمز < >
أمثلة
هنا قمنا بتعريف كلاس إسمه GenericClass
يملك نوعي بيانات غير محددين يرمز لهما بالحرفين E1 و E2.
public class GenericClass <E1, E2> { }
هنا قمنا بتعريف إنترفيس إسمه GenericInterface
يملك نوعي بيانات غير محددين يرمز لهما بالحرفين E1 و E2.
public interface GenericInterface <E1, E2> { }
هنا قمنا بتعريف دالة إسمها genericMethod
تملك نوعي بيانات غير محددين يرمز لهما بالحرفين T1 و T2.
public <T1, T2> void genericMethod(T1 a, T2 b) { System.out.println(a); System.out.println(b); }
أمثلة شاملة حول التعامل مع التعميم
التعامل مع التعميم يكون بأشكال مختلفة ستتعرف عليها من الأمثلة التي وضعناها لك, كما أننا وضعنا خلاصة في نهاية كل مثال.
مصطلحات تقينة
- Generic Method: تعني تعريف دالة تتعامل مع أكثر من نوع بيانات.
- Generic Class: تعني تعريف كلاس يتعامل مع أكثر من نوع بيانات.
- Bounded Type Parameters: تعني تعريف كلاس, إنترفيس أو دالة يتعاملوا مع نوع محدد. بالإضافة إلى جميع الأنواع المشتقة منه, أي التي ترث منه.
المثال الأول
المثال التالي هو تطبيق لفكرة الـ Generic Method.
ستتعلم منه كيف تستغل مبدأ التعميم لبناء دالة تتعامل مع مختلف أنواع المصفوفات.
المثال الثاني
المثال التالي هو تطبيق لفكرة الـ Generic Class.
ستتعلم منه كيف تستغل مبدأ التعميم لبناء كلاس يتعامل مع مختلف الأنواع.
المثال الثالث
المثال التالي هو تطبيق لفكرة الـ Bounded Type Parameters.
ستتعلم في منه كيف تستغل مبدأ التعميم لبناء دوال تتعامل مع مختلف أنواع الأرقام فقط.