لا توجد نتائج

بحثك لم يطابق أي نتائج.

نقترح أن تجرِّب ما يلي للمساعدة في العثور على ما تبحث عنه:

  • تحقق من تهجئة كلماتك الرئيسية التي تبحث عنها.
  • استخدم المرادفات للكلمة الرئيسية التي كتبتها، على سبيل المثال، جرِّب “تطبيق” بدلاً من “برنامج.”
  • جرِّب إحدى عمليات البحث الشائعة الموضحة أدناه.
  • ابدأ بحثًا جديدًا.
الأسئلة الرائجة

 

Java 9 | مقتطف

فهم وحدات Java 9

ما المقصود بها وطريقة استخدامها؟

من بول ديتيل


بول ديتيل

بول ديتيل

في هذه المقالة، أقدم نظام الوحدة النمطية لمنصة Java 9 (JPMS)، وهي أهم تقنية هندسة برامج جديدة في Java منذ إنشائها. وحدة نمطية—نتيجة مشروع Jigsaw—تساعد المطورين على جميع المستويات على أن يكونوا أكثر إنتاجية خلال إنشاء أنظمة البرامج وصيانتها وتطويرها، وخاصة الأنظمة الكبيرة.

ما المقصود بالوحدة النمطية؟

تضيف الوحدة النمطية مستوى أعلى من التجميع فوق الحزم. يمثل عنصر اللغة الجديد الرئيس الوحدة النمطية - وهو مجموعة ذات أسماء فريدة وقابلة لإعادة الاستخدام من الحزم ذات الصلة، بالإضافة إلى الموارد (مثل الصور وملفات XML) وواصف وحدة نمطية يحدد

  • اسم الوحدة النمطية
  • تبعيات الوحدة (أي، الوحدات الأخرى التي تعتمد عليها هذه الوحدة)
  • الحزم التي تقدم التوافر بشكل صريح للوحدات الأخرى (جميع الحزم الأخرى في الوحدة غير متاحة ضمنيًا لوحدات نمطية أخرى)
  • الخدمات التي تقدمها
  • الخدمات التي تستهلكها
  • إلى الوحدات الأخرى التي تسمح لها بانعكاس

السجل

منصة Java SE موجودة منذ عام 1995. يوجد الآن ما يقرب من 10 ملايين مطور يستخدمونها لبناء كل شيء بدءًا من التطبيقات الصغيرة للأجهزة المقيدة بالموارد—مثل تلك الموجودة في إنترنت الأشياء (IoT) والأجهزة المضمنة الأخرى—إلى الأنظمة الحيوية للأعمال والمهام الحرجة على نطاق واسع. توجد كميات هائلة من التعليمات البرمجية القديمة، ولكن حتى الآن، كانت منصة Java في المقام الأول حلًا واحدًا يناسب الجميع. على مر السنين، كانت توجد العديد من الجهود الموجهة لوضع نماذج لـ Java، ولكن لم يتم استخدام أي منها على نطاق واسع—ولا يمكن استخدام أي منها لوضع نماذج منصة Java.

لقد كان إنشاء نماذج لنظام Java SE صعبًا في التنفيذ، وقد استغرق الجهد سنوات عديدة. JSR 277: تم اقتراح نظام وحدة Java النمطية في الأصل في عام 2005 لـ Java 7. تم استبدال JSR هذا لاحقًا بواسطة JSR 376: Java Platform Module System واستهدف Java 8. أصبحت منصة Java SE الآن نمطية في Java 9، ولكن بعد تأخير Java 9 حتى سبتمبر 2017 فحسب.

الأهداف

يجب أن تحدد كل وحدة تبعياتها بشكل صريح.

وفقًا إلى JSR 376، فإن الأهداف الرئيسة لتكوين منصة Java SE هي

  • توفر الوحدة النمطية للتكوين الموثوق—بها آليات لتعريف التبعيات بوضوح بين الوحدات النمطية بطريقة يتم التعرف عليها في وقت التجميع ووقت التنفيذ. يمكن للنظام التنقل خلال هذه التبعيات لتحديد المجموعة الفرعية لجميع الوحدات المطلوبة لدعم التطبيق.
  • التضمين القوي—يمكن الوصول إلى الحزم الموجودة في الوحدة النمطية للوحدات الأخرى إذا قامت الوحدة بتصديرها بشكل صريح فحسب. حتى ذلك الحين، لا يمكن لوحدة نمطية أخرى استخدام تلك الحزم ما لم تنص صراحة على أنها تتطلب إمكانات الوحدة الأخرى. وهذا يحسن أمان المنصة لأن فئات أقل يمكن للمهاجمين المحتملين الوصول إليها. قد تجد أن التفكير في وحدات نمطية يساعدك على التوصل إلى تصميمات أنظف وأكثر منطقية.
  • منصة Java القابلة للتوسيع—في السابق، كانت منصة Java أحادية تتكون من عدد كبير من الحزم، مما يجعل من الصعب تطويرها وصيانتها وتنميتها. لا يمكن تجميعها بسهولة. يتم الآن تقسيم المنصة إلى 95 وحدة (قد يتغير هذا الرقم مع تطور Java). يمكنك إنشاء أوقات تشغيل مخصصة تتكون من وحدات تحتاج إليها لتطبيقاتك أو الأجهزة التي تستهدفها فحسب. على سبيل المثال، إذا كان الجهاز لا يدعم واجهات المستخدم الرسومية، فيمكنك تكوين وقت تشغيل لا يتضمن وحدات واجهة المستخدم الرسومية، مما يقلل بشكل كبير من حجم وقت التشغيل.
  • تكامل المنصة أكبر—قبل Java 9، كان من الممكن استخدام العديد من الفئات في المنصة والتي لم تكن مخصصة للاستخدام من قبل فئات التطبيق. ومع التضمين القوي، يتم تضمين واجهات برمجة التطبيقات الداخلية هذه بالفعل وإخفائها عن التطبيقات باستخدام المنصة. يمكن أن يؤدي ذلك إلى جعل عملية ترحيل التعليمات البرمجية القديمة إلى مشكلة Java 9 النمطية إذا كانت التعليمات البرمجية تعتمد على واجهات برمجة التطبيقات الداخلية.
  • أداء مُحسّن—تستخدم JVM تقنيات تحسين مختلفة لتحسين أداء التطبيقات. يشير JSR 376 إلى أن هذه التقنيات أكثر فعالية عندما يكون من المعروف مسبقًا أن الأنواع المطلوبة موجودة في وحدات محددة فحسب.

عرض وحدات JDK

أحد الجوانب المهمة في Java 9 هو تقسيم JDK إلى وحدات نمطية لدعم التكوينات المختلفة. (استشارات "JEP 200: برنامج JDK للوحدة النمطية." يتم عرض كل وحدات JEP وJSR الخاصة بـ Java في الجدول 1.) باستخدام أمر java من مجلد حاوية JDK مع خيار --list-modules، كما في: 

java --list-modules

تعرض مجموعة الوحدات النمطية الخاصة بـ JDK، والتي تتضمن الوحدات النمطية القياسية التي تنفذ مواصفات Java Language SE (أسماء تبدأ بـ java) ووحدات نمطية JavaFX (أسماء تبدأ بـ javafx) ووحدات نمطية خاصة بـ JDK (أسماء تبدأ بـ jdk) ووحدات نمطية خاصة بـ Oracle (أسماء تبدأ بـ oracle). يتبع كل اسم وحدة نمطية سلسلة الإصدار—@9 يشير إلى أن الوحدة النمطية تنتمي إلى Java 9.

إعلانات الوحدة النمطية

كما ذكرنا، يجب أن توفر الوحدة النمطية بيانات تعريف—واصف الوحدة النمطية تحدد تبعيات الوحدة النمطية، والحزم التي تتيحها الوحدة النمطية للوحدات الأخرى، وأكثر من ذلك. واصف الوحدة هو الإصدار المجمع لتعريف الوحدة النمطية المحدد في ملف باسم module-info.java. يبدأ كل إعلان عن وحدة بالكلمة الأساس الوحدة، متبوعًا باسم وحدة نمطية فريد ونص وحدة محاطة بأقواس، كما في:

الدافع الرئيس لنظام الوحدة هو التضمين القوي.

الوحدة النمطية modulename {
}

يمكن أن يكون نص تعريف الوحدة النمطية فارغًا أو قد يحتوي على العديد من إرشادات الوحدة النمطية، بما في ذلك تتطلب وتصدر وتوفر…بـ وتستخدم وتفتح (نناقش كل منها). كما سترى لاحقًا، يؤدي تجميع تعريف الوحدة النمطية إلى إنشاء واصف الوحدة النمطية، والذي يتم تخزينه في ملف باسم module-info.class في المجلد الجذر للوحدة النمطية. نقدم هنا بإيجاز كل توجيه للوحدة النمطية. بعد ذلك، سنقدم تعريفات وحدة نمطية فعلية.

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

requires. يشير توجيه الوحدة النمطية requires إلى أن هذه الوحدة النمطية تعتمد على وحدة نمطية أخرى—وتسمى هذه العلاقة تبعية الوحدة النمطية. يجب أن تحدد كل وحدة تبعياتها بشكل صريح. عندما الوحدة أ تتطلب، يُقال للوحدة أ القراءة، والوحدة ب هي القراءة بواسطة الوحدة أ. لتحديد تبعية على وحدة نمطية أخرى، استخدم requires، كما يلي:

تتطلب modulename;

يوجد أيضًا توجيه يتطلب الثبات للإشارة إلى أن الوحدة النمطية مطلوبة في وقت التجميع، ولكنها اختيارية في وقت التشغيل. يُعرف ذلك باسم تبعية اختيارية ولن تتم مناقشتها في هذه المقدمة.

يتطلب قابلية قراءة الضمنية. لتحديد تبعية على وحدة نمطية أخرى وللتأكد من أن الوحدات الأخرى التي تقوم بقراءة الوحدة الخاصة بك تقرأ أيضًا التبعية—المعروفة باسم القراءة الضمنية- استخدم يتطلب انتقالي، كما في:

يتطلب modulename انتقالية؛

ضع في الاعتبار التوجيه التالي من إعلان الوحدة النمطية java.desktop:

يتطلب java.xmlانتقالية؛ 

في هذه الحالة، أي وحدة نمطية تقرأ java.desktop تقرأ أيضًا ضمنيًا java.xml. على سبيل المثال، إذا أرجع أسلوب من الوحدة النمطية java.desktop نوعًا من الوحدة النمطية java.xml، فستعتمد التعليمات البرمجية الموجودة في الوحدات النمطية التي تقرأ java.desktop على java.xml. بدون توجيه تتطلب تلقائي في تعريف الوحدة النمطية الخاصة بـ java.desktop، لن يتم تجميع هذه الوحدات التابعة ما لم تتم قراءة بشكل صريح java.xml.

وفقًا إلى JSR 379، يجب أن تمنح الوحدات القياسية لـ Java SE قابلية قراءة ضمنية في جميع الحالات مثل تلك الموضحة هنا. أيضًا، على الرغم من أن وحدة Java SE القياسية قد تعتمد على وحدات نمطية غير قياسية، إلا أنها يجب ألا تمنح قابلية القراءة الضمنية لها. يضمن هذا أن التعليمات البرمجية اعتمادًا على وحدات Java SE القياسية قابلة للنقل عبر عمليات تنفيذ Java SE.

تصدر وتصدر...إلى. يحدد توجيه الوحدة النمطية تصدر إحدى حزم الوحدة النمطية التي يجب أن تكون أنواع العامة الخاصة بها (والأنواع العامة ومحمية المتداخلة الخاصة بها) قابلة للوصول إلى التعليمات البرمجية في جميع الوحدات الأخرى. يتيح توجيه تصدر…إلى إمكانية التحديد في قائمة مفصولة بفاصلة والتي يمكن للتعليمات البرمجية للوحدة أو الوحدات النمطية الوصول إلى الحزمة المصدرة - ويُعرف هذا بالتصدير المؤهل.

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

يوفر...باستخدام. يحدد توجيه الوحدة النمطية توفر…بـ أن الوحدة النمطية توفر تنفيذ خدمة—مما يجعل الوحدة النمطية مزود خدمة. يحدد جزء توفر من التوجيه واجهة أو فئة الملخص مدرجة في توجيه تستخدم الخاص بالوحدة النمطية ويحدد جزء مع من التوجيه اسم فئة موفر الخدمة التي تنفذ الواجهة أو توسع فئة الملخص.

فتح، فتح، وفتح...إلى. قبل Java 9، يمكن استخدام الانعكاس لمعرفة جميع الأنواع في حزمة وجميع الأعضاء من النوع—حتى أعضاء خاص—سواء كنت تريد السماح بهذه الإمكانية أم لا. وهكذا، لم يكن أي شيء موجودًا فعلًا.

الدافع الرئيس لنظام الوحدة هو التضمين القوي. بشكل افتراضي، لا يمكن الوصول إلى نوع في وحدة نمطية بوحدات نمطية أخرى ما لم يكن نوعًا عامًا و تصدر الحزمة الخاصة بها. ستعرض الحزم التي تريد الكشف عنها فحسب. باستخدام Java 9، ينطبق هذا أيضًا على الانعكاس.

السماح بالوصول لحزمة في وقت التشغيل فحسب. توجيه وحدة نمطية تفتح إلى النموذج

فتح الحزمة

يشير إلى أن أنواع عامة الخاصة بـ حزمة محددة (والأنواع العامة والمحمية المتداخلة الخاصة بها) يمكن الوصول إليها من خلال تعليمات برمجية في وحدات أخرى في وقت التشغيل فقط. أيضًا، يمكن الوصول إلى جميع الأنواع الموجودة في الحزمة المحددة (وكل أعضاء الأنواع) عن طريق الانعكاس.

السماح بالوصول إلى حزمة في وقت التشغيل فحسب بواسطة وحدات محددة. توجيه وحدة نمطية تفتح…إلى للنموذج

فتح حزمة إلى قائمة الوحدات المفصولة بفاصلة

يشير إلى أن أنواع العامة الخاصة بـ الحزمة (والأنواع العامة والمحمية المتداخلة الخاصة بها) يمكن الوصول إليها من خلال التعليمات البرمجية الموجودة في الوحدات المدرجة في وقت التشغيل فحسب. يمكن الوصول إلى جميع الأنواع الموجودة في الحزمة المحددة (وكل أعضاء الأنواع) عبر الانعكاس إلى التعليمات البرمجية في الوحدات المحددة.

السماح بالوصول إلى وقت التشغيل فحسب لكل الحزم في وحدة نمطية. إذا كان يجب الوصول إلى جميع الحزم الموجودة في وحدة محددة في وقت التشغيل ومن خلال التفكير في جميع الوحدات الأخرى، يمكنك فتح الوحدة بأكملها، كما في:

فتح الوحدة النمطية modulename {
// توجيهات الوحدة النمطية

إعدادات الانعكاس الافتراضية

وفقًا إلى الإعدادات الافتراضية، يمكن لوحدة نمطية ذات وصول عاكس لوقت التشغيل إلى حزمة أن ترى أنواع عامة الخاصة بالحزمة (والأنواع العامة والمحمية المتداخلة الخاصة بها). ومع ذلك، يمكن للتعليمة البرمجية في الوحدات الأخرى الوصول إلى كل الأنواع في الحزمة المعروضة وكل الأعضاء داخل تلك الأنواع، بما في ذلك أعضاء خاصة عبر setAccessible، كما هو الحال في إصدارات Java السابقة.

لمزيد من المعلومات حول setAccessible والانعكاس، يرجى الاطلاع على وثائق Oracle.


بول ديتيل، الرئيس التنفيذي والمدير الفني لـ Deitel & Associates، هو خريج في معهد ماساتشوستس للتكنولوجيا (MIT) بـ 35 عامًا من الخبرة في مجال الحوسبة. هو بطل في Java ويجري البرمجة في Java منذ أكثر من 22 عامًا. هو والمؤلف المشارك، دكتور هارفي م. ديتيل، هي الكتاب الأكثر مبيعًا للغة البرمجة في العالم. قدم بول دورات برمجة Java وAndroid وiOS وC# وC+ وC والإنترنت إلى عملاء الصناعة والحكومة والأكاديميين على المستوى الدولي.


ملاحظة: هذه المقالة مقتبسة من Java Magazine سبتمبر/أكتوبر 2017.

تعرّف على المزيد