حزمة محتوى
يجب تصميم محتويات الحزمة بعناية بحيث تتضمن فقط فئات وواجهات ذات صلة وظيفيًا. يمكن للفصول في الحزمة الوصول بحرية إلى الأعضاء غير الخاصة من الفئات الأخرى في الحزمة ، وقد يكون لدى بعض الفصول أذونات كافية للوصول إلى التفاصيل الداخلية للفئات الأخرى. من أجل تجنب مثل هذه الفئات من أعضاء الفصل الخاطئ ، نحتاج إلى حماية أعضاء الفصل. يمكن الوصول إلى أي عضو لم يتم إعلانه على أنه خاص من قبل جميع الأنواع الأخرى في نفس الحزمة ، لذلك قد تكون أي فئات غير ذات صلة أكثر تنسيقًا مما نتوقع.
توفر الحزم أيضًا تجميعًا منطقيًا للمبرمجين الذين يبحثون عن واجهات وفئات مفيدة. تجعل الحزم المكونة من فصول غير ذات صلة من الصعب على المبرمجين معرفة الواجهات والفئات المفيدة ، ويمكن للتجميع المنطقي للفئات مساعدة المبرمجين على إعادة استخدام الكود لأن المبرمجين يمكنهم العثور على ما يحتاجون إليه بسهولة أكبر من خلال التجميع المنطقي. إذا كانت الحزمة تحتوي فقط على مجموعات النوع المرتبطة بإحكام ، فهذا يعني أنه يمكننا إعطاء النوع بعض الأسماء الأكثر سهولة لتجنب تعارضات الاسم.
يمكن أن تكون الحزم متداخلة. على سبيل المثال ، java.lang هي حزمة متداخلة حيث تتداخل الحزمة lang في حزمة أكبر Java ، في حين أن الحزمة J Ava تحتوي أيضًا على بعض الحزم الأخرى. التعشيش يجعل الحزم ذات الصلة تشكل نظام تسمية مع بنية هرمية.
على سبيل المثال ، لإنشاء مجموعة من الحزم للأنظمة التكيفية مثل الشبكات العصبية والخوارزميات الوراثية ، يمكننا تسمية الحزم بأسماء مفصولة DOT لإنشاء حزم متداخلة:
حزمة تكيفية. الشبكة العصبية
يقع الملف المصدر الذي يحتوي على بيان الإعلان أعلاه في حزمة Adaptive.nuralNet ، وحزمة exaptive.neuralnet نفسها هي مجموعة فرعية للحزمة التكيفية. قد تحتوي الحزمة التكيفية على بعض الفئات المتعلقة بالخوارزميات التكيفية العامة ، مثل فئات بيان مشكلة التعميم أو فئات القياس. تحتوي الحزم الموجودة في وضع أعمق في التسلسل الهرمي (مثل Adaptive.neu-Ralnet أو Adaptive.genetic) على فئات تتعلق بنوع معين من الخوارزمية التكيفية.
تعشش الحزم هو مجرد أداة لتنظيم الحزم ذات الصلة ، ولا توفر أي حقوق وصول خاصة بين الحزم.
لا يمكن لبرنامج الفئة في الحزمة Adaptive.genetic الوصول إلى الأعضاء في حزمة Adaptive أو Adaptive.NuralNet التي لها حقوق الوصول إلى الحزمة ، ونطاق الحزمة ينطبق فقط على حزم محددة. يمكن أن يؤدي تعشيش الحزم إلى تجميع الحزم ذات الصلة ومساعدة المبرمجين في العثور على الفئة المطلوبة في المستوى المنطقي أكثر ارتباطًا ، ولكن بعد ذلك ، لا يجلب أي فوائد أخرى.
ملاحظات الحزمة
الحزمة يمكن أن يكون أيضا التعليقات التوضيحية. ولكن المشكلة هي أنه نظرًا لأن الحزم هي بنية تنظيمية وليس لديها كيانات رمز المصدر وليس لها تعريف فعلي ، فلا يمكن شرحها مثل الفصول أو الأساليب. لذلك ، لا يمكن تحقيق التعليق التوضيحي للحزمة إلا من خلال شرح بيان إعلان الحزمة في الملف المصدر. ومع ذلك ، لا يمكن أن يكون هناك سوى إعلان حزمة واحد في كل حزمة يمكن أن يكون لها تعليقات توضيحية تعمل عليها.
إذن كيف يمكنك التعليق على الحزم؟ في الواقع ، لا تجبر Java المبرمجين على استخدام بطريقة ما للتعامل مع قاعدة "بيان الحزمة المشروح الفردي". تتمثل الطريقة الموصى بها في إنشاء ملف يسمى Package-I nfo.java في دليل الحزمة ، حيث يتم تخزين فقط عبارات الحزمة وشروح الحزمة دون وضع أي شيء آخر. على سبيل المثال ، يبدو ملف info.java الحزمة لحزمة ATTR هكذا:
packagespec (اسم اثنين من "attr project" ، الإصدار = "1.0" developmentesite ("attr.project.org") DevelopmentModel ("Open-Source) Package ؛يتم استخدام PackagesPec و DevelopmentSite و Development OpmentModel لتعديل أنواع التعليقات التوضيحية. بالطبع ، لديهم استراتيجيات توفير وقت التشغيل. يجب تجميع ملف package-info.java مع ملفات مصدر أخرى في الحزمة.
نوصي بوضع جميع المعلومات المتعلقة بالحزم في ملف حزمة info.java. إذا قمت بذلك ، يمكنك وضع تعليقات المستندات في بداية الملف ، بحيث يتم شرح هذه المستندات كمستندات حزمة.
كائنات الحزمة والمواصفات
عادة ما تنفذ الحزم بعض المواصفات ، وعادة ما تكون من المؤسسة. تختلف كائنات الحزمة عن أنواع الانعكاس الأخرى ولا يمكن استخدامها لإنشاء أو تشغيل الحزم ، ولكن يمكن أن تعمل فقط كقاعدة معرفة لتوفير المعلومات ، والتي توفر معلومات حول المواصفات التي تنفذها الحزمة (العنوان والبائع ورقم الإصدار للمواصفات) والمعلومات حول تنفيذ الحزمة نفسها (العنوان ، والبائع ورقم الإصدار من الحزمة). على الرغم من أن الحزم تأتي عادة من المنظمات الفردية ، إلا أنه يمكن تحديد المواصفات التي تنفذها (مثل مكتبات التحليل الإحصائي) من قبل المنظمات الأخرى. قد تحتاج البرامج التي تستخدم الحزم إلى معرفة إصدار المواصفات التي تنفذها الحزمة ، بحيث يمكن استخدام الوظائف المحددة فقط في إصدار معين. وبالمثل ، قد تحتاج هذه البرامج أيضًا إلى معرفة إصدار التنفيذ الذي يتم توفيره لها ، وذلك أساسًا للتعامل مع العيوب المحتملة في الإصدارات المختلفة. تتيح بعض الطرق الرئيسية لفئة الحزمة الوصول إلى هذه المعلومات:
على سبيل المثال ، إذا قمت باستخراج هذه المعلومات من حزمة Java.lang في نظامنا ، فستحصل على النتائج التالية: '
عنوان المواصفات: Java Platform API ، الإصدار المواصفات: 1.4 مواصفات بائع: Sun Microsystems ، Inc. عنوان التنفيذ: Java Runtime Environment إصدار تنفيذ: 1.5.0_02 بائع التنفيذ: Sun Microsystems ، Inc.
يتكون رقم الإصدار الكنسي من أرقام غير سالبة مفصولة بواسطة محددات الفترة ، مثل "" 2.0 "أو "111 .0.12". يتيح لنا هذا النمط استدعاء طريقة isCompatibleWith لمقارنة رقم الإصدار الذي يتبع هذا النمط برقم إصدار الحزمة. إذا كان رقم إصدار الحزمة أكبر من أو يساوي رقم إصدار الخلف ، فسيتم إرجاع الطريقة بشكل صحيح. تقارن هذه المقارنة فقط رقمًا مفصلاً في وقت واحد. إذا كان أي من هذه الأرقام أصغر من الموضع المقابل في رقم الإصدار الذي تم تمريره ، فإن الإصدارين غير متوافقين. إذا كان أحد أرقام الإصدار أطول من الآخر ، فسيتم اعتبار الجزء المفقود في أرقام الإصدار القصيرة صفرًا. على سبيل المثال ، إذا كان رقم الإصدار الكنسي للحزمة هو "1.4" ونقارنه بـ "1.2" أو "1.3.1". أو ".1.81. ، فسيتم إرجاع True ؛ ولكن إذا ما قورنت مع "1.4.2". أو ".5" ، سيتم إرجاع خطأ. هذا الاستنتاج يتم استخلاصه لأن آلية المقارنة هذه تفترض أن إصدار المواصفات متوافق للخلف.
لا يوجد تنسيق محدد لرقم إصدار التنفيذ ، لأن المؤسسات المختلفة التي توفر التنفيذ ستحدد إصدار التنفيذ بشكل مختلف. المقارنة الوحيدة التي يمكن إجراؤها بين إصدارات التنفيذ هي اختبار ما إذا كان الإصدار هو نفسه ، حيث لا يوجد افتراض للتوافق المتخلف.
يمكن إغلاق الحزمة ، مما يعني أنه لم يعد بإمكان الطبقات إضافة إلى الحزمة. يمكن أن تحتوي الحزم غير المعروفة على فئات من مواقع مختلفة متعددة في مسار البحث في الفصل ، في حين يجب أن تأتي محتويات الحزمة المختومة من نفس الموقع - إما أرشيف معين أو موقع محدد بواسطة عنوان URL. هناك طريقتان لتحديد ما إذا كانت الحزمة مغلقة:
.
. إذا كان لا يمكن تحميل الفئة الموجودة في الحزمة من عنوان URL المحدد ، أو لم يتم إغلاق الحزمة ، ثم يتم إرجاع FALSE ، وعادة ما يتم توفير معلومات المواصفات والتنفيذ الخاصة بالحزمة كجزء من ملف البيان المخزّن مع الحزمة - على سبيل المثال كجزء من ملف البيان في أرشيف Java (جار) ، كما هو موضح في القسم 25.9.2 ، "Archive File Java.jar". عندما يتم تحميل فئة في حزمة ، يتم قراءة هذه المعلومات من قبل الشخص. يمكن لمحمل Classload تحديد كائن الحزمة ديناميكيًا للفصل الذي يريد تحميله:
يمكننا استدعاء طريقة getPackage لكائن الفئة من الفئة المحددة للحصول على كائن الحزمة في هذه الفئة. يمكننا أيضًا الاتصال بـ static package.getPackage باستخدام اسم الحزمة المحدد للحصول على كائن الحزمة ، أو الاتصال بـ static package.getPackages ، والتي ستعيد مجموعة الحزمة المكونة من جميع الحزم المعروفة حاليًا إلى تحميل الفئة. ترتبط كلتا الطريقتين بموادي الفئة الذي يستدعي رمزهما ، لأن هذه الرموز ستستدعي أساليب GetPackage أو GetPackages الخاصة بـ Loader الخاصة بهم. ستبحث طرق اللوادر الفئة هذه عن محمل فئة محدد وجميع لوادرها من الفئة الأم ، وإذا لم يتم إجراء إعدادات لعملية تحميل الفئة الحالية ، فسيتم استخدام محمل فئة النظام في هذا الوقت. لاحظ أنه إذا كانت الحزمة غير معروفة ، فسيتم إرجاع طريقة ClassLoader NULL لأنه لم يتم تحميل أي نوع في الحزمة في هذا الوقت.