sealed class
الأصناف المختومة sealed class
sealed class تحصر كل الأنواع الفرعية الممكنة في نفس الملف/الحزمة — تتيح لـ when تغطية شاملة دون else.
sealed class تشبه enum لكنها تسمح لكل حالة بحمل بيانات مختلفة عبر أصناف فرعية خاصة بها. لأن المترجم يعرف كل الأصناف الوارثة الممكنة وقت الترجمة، فإن when على قيمة من نوع sealed لا يحتاج else إن غطّى كل الحالات — وأي حالة جديدة تُضاف مستقبلًا تُجبر المطوّر على تحديث كل when ذات صلة.
الصياغة
sealed class الاسم data class فرع1(...) : الاسم() object فرع2 : الاسم()
📄 مثال
sealed class NetworkResult
data class Success(val data: String) : NetworkResult()
data class Failure(val error: String) : NetworkResult()
object Loading : NetworkResult()
fun render(result: NetworkResult) = when (result) {
is Success -> println(result.data)
is Failure -> println("خطأ: ${result.error}")
Loading -> println("جارٍ التحميل...")
// لا حاجة لـ else — تمت تغطية كل الحالات
}أهم النقاط
| العنصر | الوظيفة |
|---|---|
| sealed class | صنف أساس تُعرف كل أصنافه الفرعية في نفس الوحدة |
| data class فرعي | حالة تحمل بيانات مختلفة عن الحالات الأخرى |
| object فرعي | حالة بلا بيانات إضافية (singleton) |
💡 نصائح عملية
- استخدمها لتمثيل حالة واجهة محدودة (تحميل/نجاح/خطأ) بدل أعلام boolean متعددة
- أضف حالة فرعية جديدة بثقة — الكومبايلر سيشير لكل when ناقصة تغطية تلك الحالة
⚠️ أخطاء شائعة
- الخلط بينها وبين enum عندما تحتاج كل حالة بيانات مختلفة — enum لا يدعم ذلك بمرونة sealed class
- إضافة else غير ضرورية تُخفي تحذير الكومبايلر عند إضافة حالة جديدة لاحقًا
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار KOTLIN الكامل بالعربي.