الحزم والاستيرادات
الحزم والاستيرادات
مع نمو برنامجك في Java وتجاوزه عدة كلاسات، تحتاج إلى طريقة لتنظيمها — تمامًا كما تنظّم الملفات في مجلدات على حاسوبك. تحل Java هذه المشكلة بـ الحزم (Packages). الحزمة هي مجموعة مسمّاة من الكلاسات والواجهات المترابطة. تخدم الحزم غرضين: تنظيم الكود، ومنع تعارض الأسماء بين كلاسات تشترك في الاسم ذاته.
تعليمة package
يمكن لكل ملف مصدري في Java أن يبدأ بتعليمة package تُعلن الحزمة التي ينتمي إليها الكلاس. يجب أن تكون هذه التعليمة أول سطر غير تعليقي في الملف.
تتبع أسماء الحزم نمط اسم النطاق معكوسًا باتفاقية. إذا كان نطاقك mybank.com، فالحزمة العليا هي com.mybank. تُقسَّم الحزم الفرعية الاهتمامات أكثر: com.mybank.accounts وcom.mybank.loans وcom.mybank.util.
package com.mybank.accounts يجب أن يقع داخل المسار com/mybank/accounts/ نسبةً إلى جذر الكود المصدري. تُطبّق أدوات البناء الحديثة (Maven وGradle) وبيئات التطوير هذا القيد تلقائيًا.
الحزمة الافتراضية
إذا حذفت تعليمة package، انتمى الكلاس إلى الحزمة الافتراضية — حزمة بلا اسم. هذا مقبول في التجارب الصغيرة ذات الملف الواحد، لكن لا تستخدمه في مشاريع حقيقية لأن كلاسات الحزمة الافتراضية لا يمكن استيرادها من كلاسات ذات حزم مسمّاة.
استيراد الكلاسات بـ import
حين تريد استخدام كلاس من حزمة مختلفة، لديك خياران. الأول هو الاستيراد الفردي: تذكر الكلاس المحدد الذي تحتاجه.
الخيار الثاني هو الاستيراد بالبدل الذي يجلب كل الأنواع العامة من حزمة:
الأسماء المؤهَّلة بالكامل
يمكنك دائمًا الإشارة إلى كلاس بـ اسمه المؤهَّل بالكامل — المسار الكامل package.ClassName — دون أي تعليمة استيراد:
الأسماء المؤهَّلة مطوّلة، لذا تُستخدم أساسًا حين تحتوي حزمتان على كلاسات بالاسم ذاته وتحتاج لكليهما في الملف نفسه:
حزمة java.lang مستوردة دائمًا
استخدمت String وSystem وMath وInteger طوال الوقت دون استيرادها. السبب أن كل ملف Java يستورد تلقائيًا جميع كلاسات java.lang. لن تحتاج أبدًا لكتابة import java.lang.String.
الاستيرادات الساكنة
يتيح لك الاستيراد الساكن استخدام الأعضاء الساكنة (الحقول والوظائف) لكلاس آخر دون تأهيلها باسم الكلاس. الاستخدام الأكثر شيوعًا هو ثوابت ووظائف Math:
sqrt أو PI. خصّص الاستيرادات الساكنة للثوابت ووظائف الأدوات المعروفة جيدًا (كـ Math أو تأكيدات JUnit).
هيكل حزم واقعي
إليك كيف يمكن تنظيم تطبيق مصرفي صغير في حزم:
لكل حزمة مسؤولية واضحة. accounts تحتوي كلاسات الحسابات، وloans تحتوي كلاسات القروض، وutil تحتوي المساعدات المشتركة. هذا يعكس ما تعلّمته في الفصل بين الحقول والوظائف والمُنشئات داخل الكلاس — الآن تفعل الشيء ذاته على مستوى أعلى.
محدّدات الوصول والحزم مراجعة
تعلّمت عن public وprivate وprotected في الدرس الرابع. ثمة مستوى رابع ربما لم تنتبه إليه: package-private (بلا كلمة مفتاحية). الكلاس أو العضو الذي لا يحمل محدّد وصول يكون مرئيًا داخل حزمته فقط. هذا مفيد للمساعدات الداخلية التي تريد مشاركتها داخل الحزمة مع إخفائها عن بقية التطبيق.
AccountValidator مرئي لكل كلاس داخل com.mybank.accounts لكنه غير مرئي لكلاسات الحزم الأخرى — طريقة نظيفة لإخفاء التفاصيل الداخلية.
الخلاصة
الحزم هي آلية Java لتنظيم الكلاسات والتحكم في رؤيتها. صرّح بحزمتك بتعليمة package في أعلى كل ملف مصدري، واستخدم import لجلب كلاسات من حزم أخرى، واعتمد الأسماء المؤهَّلة بالكامل حين تشترك حزمتان في اسم كلاس. حزمة java.lang متاحة دائمًا دون استيراد، والاستيرادات الساكنة تتيح استخدام الأعضاء الساكنة دون تأهيل — استخدمها باعتدال. تُتيح لك هذه الأدوات مجتمعةً بناء تطبيقات كبيرة تظل مقروءة وقابلة للصيانة.