Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Java 8
Code

Java 8 لتطوير Android: الطرق الافتراضية والمستمرة 

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Java 8 for Android Development.
Java 8 for Android: Cleaner Code With Lambda Expressions
Java 8 for Android Development: Stream API and Date & Time Libraries

Arabic (العربية/عربي) translation by Saadkhaled (you can also view the original English article)

كانت Java 8 خطوة كبيرة إلى الأمام بالنسبة للغة البرمجة ، والآن ، مع إصدار Android Studio 3.0 ، أصبح مطورو Android يتمتعون في النهاية بالوصول إلى دعم مدمج لبعض ميزات Java 8 الأكثر أهمية. 

في هذه السلسلة المكونة من ثلاثة أجزاء ، قمنا باستكشاف ميزات Java 8 التي يمكنك البدء في استخدامها في مشاريع Android الخاصة بك اليوم . في رمز الأنظف باستخدام تعبيرات Lambda ، قمنا بإعداد تطويرنا لاستخدام دعم Java 8 المقدم من قبل toolchain الافتراضي الخاص بشركة Android ، وذلك قبل إلقاء نظرة معمقة على تعبيرات lambda. 

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

سنقوم أيضًا بتغطية ميزة Java 8 التي تمنحك الحرية لاستخدام التعليق التوضيحي نفسه بقدر ما تريد في نفس الموقع ، بينما تظل متناسقة مع الإصدارات السابقة من Android. 

ولكن أولاً ، دعونا نلقي نظرة على ميزة Java 8 التي تم تصميمها لاستخدامها مع تعبيرات lambda التي رأيناها في المشاركة السابقة . 

F كتابة النظافة تعبيرات لامدا ، مع المراجع الأسلوب 

في آخر مشاركة ، شاهدت كيف يمكنك استخدام تعبيرات lambda لإزالة الكثير من الكود المتسلسل من تطبيقات Android. ومع ذلك ، عندما يكون تعبير lambda مجرد استدعاء طريقة واحدة لها بالفعل اسم ، يمكنك قطع المزيد من التعليمات البرمجية من مشروعك باستخدام مرجع أسلوب. 

على سبيل المثال ، هذا التعبير lambda هو في الواقع مجرد إعادة توجيه العمل إلى طريقةhandleViewClick موجودة : 

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

في مثال Floating Action Button الخاص بنا ، يمكننا استخدام مرجع الأسلوب كجسم تعبير لامدا لدينا: 

لاحظ أن الطريقة المشار إليها يجب أن تأخذ نفس المعلمات مثل الواجهة - في هذا المثال ، هذا هو العرض . 

يمكنك استخدام عامل مرجع الأسلوب ( :) للإشارة إلى أي مما يلي: 

طريقة ثابتة 

إذا كان لديك تعبير lambda الذي يستدعي أسلوبًا ثابتًا: 

ثم يمكنك تحويلها إلى مرجع أسلوب: 

على سبيل المثال ، إذا كان لديك طريقة ثابتة PrintMessage في فئة MyClass ، فإن مرجع الأسلوب الخاص بك سيبدو كما يلي: 

طريقة مثيل كائن معين 

هذه طريقة مثيل لكائن معروف سابقًا ، مما يتيح لك استبدال: 

مع: 

لذا ، إذا كان لديك تعبير لامدا التالي: 

ثم يقدم لك تقديم مرجع للأسلوب ما يلي: 

طريقة مثيل كائن تعسفي من نوع معين 

هذه طريقة مثيل لعنصر تعسفي سيتم توفيره لاحقًا ، ويتم ك تابته بالتنسيق التالي:

مراجع منشئ 

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

باستخدام مراجع منشئ ، يمكنك تشغيل: 

إلى: 

على سبيل المثال ، إذا كان لديك واجهة MyInterface التالية : 

ثم يمكنك استخدام مراجع منشئ لإنشاء حالات جديدة للطلاب : 

من الممكن أيضًا إنشاء مراجع منشئ لأنواع الصفيف. على سبيل المثال ، مرجع منشئ لصفيف int int هو int [] :: new . 

أضف أساليب افتراضية إلى واجهاتك 

قبل Java 8 ، يمكنك فقط تضمين الأساليب المجردة في واجهاتك (أي الأساليب بدون جسد) ، مما جعل من الصعب تطوير الواجهات ، بعد النشر. 

في كل مرة تقوم فيها بإضافة أسلوب إلى تعريف واجهة ، فستفقد أية فئات قامت بتنفيذ هذه الواجهة فجأة تنفيذًا. على سبيل المثال ، إذا كان لديك واجهة ( MyInterface ) تم استخدامها بواسطة MyClass ، فإن إضافة أسلوب إلى MyInterface قد يؤديإلى قطع التوافق مع MyClass . 

في أفضل سيناريو حيث كنت مسؤولاً عن العدد القليل من الفصول الدراسية التي استخدمتMyInterface ، فإن هذا السلوك سيكون مزعجًا ولكن يمكن إدارته - سيكون عليك فقط تخصيص بعض الوقت لتحديث فصولك بالتنفيذ الجديد. ومع ذلك، يمكن أن تصبح الأمور كثيرا أكثر تعقيدا إذا كان عدد كبير من الطبقات تنفيذ MyInterface ، أو إذا تم استخدام واجهة في الفئات التي لم تكن مسؤولة عنها. 

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

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

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

في الواقع ، كان إدخال الأساليب الافتراضية هو السبب في تمكن Oracle من إجراء هذا العدد الكبير من الإضافات إلى واجهة برمجة تطبيقات المجموعات في Java 8. 

المجموعة عبارة عن واجهة عامة تستخدم في العديد من الفصول المختلفة ، لذلك فإن إضافة أساليب جديدة إلى هذه الواجهة كان من الممكن أن يؤدي إلى كسر عدد لا يحصى من أسطر الشفرة. بدلاً من إضافة أساليب جديدة إلى واجهة المجموعة وكسر كل فئة مشتقة من هذه الواجهة ، قامت Oracle بإنشاء ميزة الطريقة الافتراضية ، ثم أضافت هذه الأساليب الجديدة كطرق افتراضية.  إذا ألقيت نظرة على طريقة Collection.Stream () الجديدة (والتي سنستكشفها بالتفصيل في الجزء الثالث) ، فسترى أنها تمت إضافتها كطريقة افتراضية: 

يعد إنشاء طريقة افتراضية أمرًا بسيطًا ، فما عليك سوى إضافة المعدل الافتراضي إلى توقيع الطريقة: 

الآن ، إذا كان MyClass يستخدم MyInterface ولكنه لا يوفر تطبيقه الخاص لـdefaultMethod ، فسوف يرث التطبيق الافتراضي الذي توفرهMyInterface فقط . على سبيل المثال ، مازال سيتم تجميع الفئة التالية: 

يمكن للفئة التنفيذية تجاوز التطبيق الافتراضي الذي توفره الواجهة ، بحيث لا تزال الطبقات تتحكم بشكل كامل في عمليات التنفيذ الخاصة بها. 

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

تخيل أنه بالإضافة إلى MyInterface ، لديك ما يلي: 

يحتوي كل من MyInterface و SecondInterface على طريقة افتراضية بنفس التوقيع بالضبط ( defaultMethod ). الآن تخيل أنك تحاول استخدام كل من هذه الواجهات في نفس الفصل: 

في هذه المرحلة ، يكون لديك تطبيقان متعارضان من defaultMethod ، وليس لدى المترجم أي فكرة عن الطريقة التي يجب أن يستخدمها ، لذا ستواجه خطأ في المحول البرمجي. 

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

الحل الآخر هو تحديد أي إصدار من defaultMethod تريد تنفيذه ، باستخدام التنسيق التالي: 

لذلك إذا أردت استدعاء تطبيق MyInterface # defaultMethod () ، فيمكنك استخدام ما يلي: 

باستخدام طرق ثابتة في واجهات جافا 8 الخاصة بك 

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

إذا كانت لديك أساليب ثابتة خاصة بواجهة ، فإن طرق الواجهة الثابتة لـ Java 8 تعطيك طريقة لوضع هذه الطرق داخل الواجهة المقابلة ، بدلاً من الاضطرار إلى تخزينها في فصل منفصل. 

يمكنك إنشاء طريقة ثابتة عن طريق وضع الكلمة الأساسية ثابتة في بداية توقيع الطريقة ، على سبيل المثال: 

عندما تقوم بتطبيق واجهة تحتوي على طريقة واجهة ثابتة ، فإن هذا الأسلوب الثابت لا يزال جزءًا من الواجهة ولا يتم توريثه من قِبل الفئة التي تقوم بتطبيقه ، لذلك ستحتاج إلى بادئة الطريقة باستخدام اسم الواجهة ، على سبيل المثال: 

وهذا يعني أيضًا أنه يمكن للفئة والواجهة أن يكون لها أسلوب ثابت بنفس التوقيع. على سبيل المثال ، لن يؤدي استخدام MyClass.staticMethod وMyInterface.staticMethod في نفس الفئة إلى حدوث خطأ في وقت التحويل البرمجي. 

إذن ، هل الواجهة واجهات تعبيرية فقط؟ 

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

  • يمكن أن تحتوي الطبقات المجردة على متغيرات نهائية وغير نهائية ومستقرة وغير ثابتة ، في حين أن الواجهة يمكن أن تحتوي فقط على متغيرات ثابتة ونهائية. 
  • تسمح لك الفئات Abstract بإعلان الحقول غير الثابتة والنهائية ، في حين أن حقول الواجهة تكون ثابتة بطبيعتها ونهائية. 
  • في الواجهات ، تكون جميع الطرق التي تقوم بتعريفها أو تعريفها كطرق افتراضية عامة بطبيعتها ، بينما في الطبقات المجردة يمكنك تحديد الطرق الخرسانية العامة والمحمية والخاصة. 
  • الفصول الدراسية المجردة هي فئات ، وبالتالي يمكن أن يكون لها حالة ؛ واجهات لا يمكن أن يكون لها دولة المرتبطة بها. 
  • يمكنك تعريف المنشئات داخل فئة مجردة ، وهو أمر غير ممكن داخل واجهات Java. 
  • تسمح لك Java فقط بتمديد فئة واحدة (بغض النظر عما إذا كانت مجردة) ، لكنك مطلق الحرية في تنفيذ أكبر عدد ممكن من الواجهات التي تحتاجها. هذا يعني أن الواجهات عادةً ما تكون لها الحافة عندما تحتاج إلى ميراث متعدد ، على الرغم من أنك تحتاج إلى الحذر منماس الموت المميت ! 

تطبيق التعليق نفسه كما مرات عديدة كما تريد 

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

ومع ذلك ، فمع تقديم التعليقات التكرارية لـ Java 8 ، أصبح بإمكانك الآن استخدام التعليق التوضيحي نفسه بقدر ما تريد في نفس الموقع. 

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

يمكنك إخبار المحول البرمجي بإنشاء هذه الحاوية ، من خلال إكمال الخطوات التالية:

  • ضع علامة على التعليق التوضيحي المعني باستخدام التعليق التوضيحي الفهرسة القابل للتقليد (تعليق توضيحي يستخدم لإضافة تعليق توضيحي إلى التعليق التوضيحي).  على سبيل المثال ، إذا أردت جعل التعليق التوضيحي لـ ToDo قابلاً للتكرار ، فستستخدم: Repeatable (ToDos.class) . القيمة الموجودة بين قوسين هي نوع التعليق التوضيحي للحاوية الذي سينشئه المحول البرمجي في النهاية. 
  • قم بتعريف نوع التعليق التوضيحي. يجب أن يكون لهذا السمة عبارة عن صفيف من نوع التعليق التوضيحي ، على سبيل المثال: 

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

استنتاج 

في هذا الجزء الثاني من مسلسلنا على Java 8 ، رأينا كيف يمكنك أن تقطع المزيد من الكود المتعامد من مشاريع الأندرويد الخاصة بك من خلال الجمع بين تعبيرات lambda مع مراجع الأسلوب ، وكيفية تحسين واجهاتك باستخدام الطرق الافتراضية والثابتة. 

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

وأخيرًا ، على الرغم من أننا لا نزال ننتظر واجهة برمجة تطبيقات التاريخ والوقت الجديدة لـ Java 8 للوصول رسميًا على Android ، فسوف أري كيف يمكنك بدء استخدام واجهة برمجة التطبيقات الجديدة هذه في مشروعات Android اليوم ، بمساعدة بعض الجهات الخارجية المكتبات. 

في هذه الأثناء ، تحقق من بعض مشاركاتنا الأخرى على تطوير تطبيقات جافا وأندرويد! 

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.