الدوال الافتراضية في الواجهات
أضف تطبيقات للدوال مباشرةً في الواجهات مما يُتيح الوراثة المتعددة للسلوك.
مقارنة الكود
✕ Java 7
// Need abstract class to share behavior
public abstract class AbstractLogger {
public void log(String msg) {
System.out.println(
timestamp() + ": " + msg);
}
abstract String timestamp();
}
// Single inheritance only
public class FileLogger
extends AbstractLogger { ... }
✓ Java 8+
public interface Logger {
default void log(String msg) {
IO.println(
timestamp() + ": " + msg);
}
String timestamp();
}
// Multiple interfaces allowed
public class FileLogger
implements Logger, Closeable { ... }
هل ترى مشكلة في هذا الكود؟ أخبرنا.
لماذا يتفوق الأسلوب الحديث
وراثة متعددة
يمكن للفئات تطبيق واجهات كثيرة ذات دوال افتراضية بخلاف وراثة الفئة المجردة الفردية.
تطوّر الواجهة البرمجية
أضف دوالاً جديدة للواجهات دون كسر التطبيقات الموجودة.
سلوك قابل للتركيب
امزج وطابق القدرات من واجهات متعددة بحرية.
الأسلوب القديم
فئات مجردة للسلوك المشترك
الأسلوب الحديث
الدوال الافتراضية في الواجهات
منذ JDK
8
الصعوبة
متوسط
دعم JDK
الدوال الافتراضية في الواجهات
متاح
متاح منذ JDK 8 (مارس 2014).
كيف يعمل
قبل Java 8، كانت مشاركة السلوك عبر فئات غير مترابطة تتطلب فئات مجردة مما يحدّك بالوراثة الفردية. تتيح الدوال الافتراضية للواجهات توفير تطبيقات للدوال لتتمكن الفئات من وراثة السلوك من واجهات متعددة. كان هذا أساسياً لتطوير Collections API دون كسر التطبيقات الموجودة.
توثيق ذو صلة