Programming Basics SQL HTML CSS JavaScript Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Learn Typing

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> {
}
public class GenericClass <T> { }

هنا قمنا بتعريف إنترفيس إسمه GenericInterface يملك نوع بيانات غير محدد رمزنا له بحرف N.

public interface GenericInterface <N> {
}
public interface GenericInterface <N> { }

هنا قمنا بتعريف دالة إسمها genericMethod تملك نوع بيانات غير محدد رمزنا له بحرف E.

public <E> void genericMethod(E var) {
System.out.println(var);
}
public <E> void genericMethod(E var) { System.out.println(var); }


طريقة تعريف أكثر من نوع بيانات مجهول

نفس الطريقة السابقة, لكن يجب وضع فاصلة بين كل حرفين تم استخدامها بداخل الرمز < >

أمثلة

هنا قمنا بتعريف كلاس إسمه GenericClass يملك نوعي بيانات غير محددين يرمز لهما بالحرفين E1 و E2.

public class GenericClass <E1, E2> {
}
public class GenericClass <E1, E2> { }

هنا قمنا بتعريف إنترفيس إسمه GenericInterface يملك نوعي بيانات غير محددين يرمز لهما بالحرفين E1 و E2.

public interface 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);
}
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.
ستتعلم في منه كيف تستغل مبدأ التعميم لبناء دوال تتعامل مع مختلف أنواع الأرقام فقط.

شاهد المثال