switch شامل بدون default
يتحقق المترجم من تغطية جميع الأنواع الفرعية المُغلقة — لا حاجة لـ default.
مقارنة الكود
✕ Java 8
// Must add default even though
// all cases are covered
double area(Shape s) {
if (s instanceof Circle c)
return Math.PI * c.r() * c.r();
else if (s instanceof Rect r)
return r.w() * r.h();
else throw new IAE();
}
✓ Java 21+
// sealed Shape permits Circle, Rect
double area(Shape s) {
return switch (s) {
case Circle c ->
Math.PI * c.r() * c.r();
case Rect r ->
r.w() * r.h();
}; // no default needed!
}
هل ترى مشكلة في هذا الكود؟ أخبرنا.
لماذا يتفوق الأسلوب الحديث
أمان وقت الترجمة
أضف نوعاً فرعياً جديداً والمترجم يُظهر كل مكان يحتاج تحديثاً.
لا كود ميت
لا فرع default غير قابل للوصول يُخفي الأخطاء.
أنواع جبرية
مُغلق + records + switch شامل = أنواع ADT صحيحة في Java.
الأسلوب القديم
default إلزامي
الأسلوب الحديث
شمولية الأنواع المُغلقة
منذ JDK
21
الصعوبة
متوسط
دعم JDK
switch شامل بدون default
متاح
متاح على نطاق واسع منذ JDK 21 LTS (سبتمبر 2023)
كيف يعمل
عند التبديل على نوع مُغلق يعرف المترجم جميع الأنواع الفرعية الممكنة ويتحقق من معالجة كل حالة. إذا أضفت نوعاً فرعياً جديداً يُبيّن المترجم كل switch لم يعد مكتملاً.
توثيق ذو صلة