التوابع الساكنة والخاصة في الواجهات
التوابع الساكنة والخاصة في الواجهات
أضاف Java 8 التوابع الافتراضية (default) إلى الواجهات. وأكمل إضافتان لاحقتان هذه الصورة: التوابع الساكنة (Java 8) والتوابع الخاصة (Java 9). تتيح هذه الأنواع مجتمعةً للواجهات حمل منطق مساعد حقيقي دون تلويث الفئات المنفِّذة لها.
التوابع الساكنة في الواجهات
التابع الساكن في الواجهة ينتمي إلى الواجهة ذاتها لا إلى أي فئة منفِّذة. تستدعيه باسم الواجهة تمامًا كالتابع الساكن في الفئات — InterfaceName.method().
يمكن لأي فئة استدعاء Validator.requireNonNull(email, "email") دون الحاجة إلى تنفيذ Validator. لاحظ أن التابع مساعد تحمله الواجهة بذاتها؛ ولا يمكن للفئات المنفِّذة تجاوزه (override).
EmailValidator implements Validator<String>، فلا يمكنك كتابة EmailValidator.requireNonNull(...). يجب أن يمر الاستدعاء عبر Validator.requireNonNull(...). هذا مقصود — يمنع الغموض حين تنفّذ فئة واجهات متعددة تحمل كل منها تابعًا ساكنًا بالاسم ذاته.
لماذا نضع التوابع المساعدة الساكنة في الواجهة؟
قبل Java 8، كان النمط المعياري هو فئة مساعدة مرافقة — مثل Collections جنبًا إلى جنب مع Collection، أو Objects مع Object. هذا يعمل، لكنه يفصل الكود ذا الصلة إلى ملفين. تتيح التوابع الساكنة في الواجهات إبقاء منطق الأداة المساعدة بجوار العقد الذي تدعمه مباشرةً:
DiscountUtils أو Discounts. والنتيجة قابلة للاكتشاف — أي بيئة تطوير تكتب فيها Discount. تعرض المصانع المتاحة فورًا.
التوابع الخاصة في الواجهات (Java 9+)
حين وصلت التوابع الافتراضية (default)، ظهرت مشكلة سريعًا: تابعان افتراضيان أحيانًا يشتركان في منطق مكرر، لكن لم يكن ثمة مكان لوضع مساعد مشترك داخل الواجهة دون الكشف عنه كجزء من العقد العام. حلّ Java 9 هذا بـالتوابع الخاصة.
تابع format تفصيل تنفيذي. الفئات المنفِّذة لن تراه أبدًا — لا يظهر في الواجهة العامة. إن أردت لاحقًا تغيير صيغة النص، تغيّر تابعًا واحدًا بدلًا من ثلاثة.
التوابع الخاصة الساكنة في الواجهات
يمكنك أيضًا جعل التابع الخاص ساكنًا. القاعدة تشبه ما تعرفه من الفئات: التابع الخاص غير الساكن لا يُستدعى إلا من التوابع الأخرى للنسخة (أي توابع default هنا)، بينما يمكن استدعاء التابع الخاص الساكن من كلٍّ من توابع default والتوابع الساكنة.
default والساكنة الخاصة بالواجهة. محاولة استدعاء تابع خاص في الواجهة من فئة منفِّذة هي خطأ وقت الترجمة.
تجميع الصورة كاملة
إليك مثال مكتفٍ بذاته يستخدم الأنواع الأربعة من التوابع — abstract وdefault وstatic وprivate — في واجهة واحدة:
الخلاصة
- التوابع الساكنة (Java 8) — تنتمي للواجهة لا للنسخ؛ تُستدعى عبر
Interface.method()؛ ممتازة لتوابع المصنع والمساعدات النقية. - التوابع الخاصة (Java 9) — مرئية فقط داخل الواجهة؛ تُزيل التكرار عبر توابع
default. - التوابع الخاصة الساكنة (Java 9) — كالتوابع الخاصة لكن قابلة للاستدعاء من التوابع الساكنة أيضًا.
- لا التوابع الساكنة ولا الخاصة جزء من العقد — الفئات المنفِّذة لا ترثها ولا تتجاوزها.