تكرار السؤال: …
الإجابة المختصرة
Enum يمثل مجموعة ثابتة من القيم الفردية المتطابقة، بينما Sealed Class تمثل تسلسلاً هرميًا مقيدًا يسمح لكل فرع بامتلاك حالته وبياناته الخاصة.
الشرح
تعتبر Sealed Class/Interface الخيار المثالي لتمثيل حالات واجهة المستخدم (UI State) وأحداثها في معمارية MVI/MVVM؛ لأن كل حالة (مثل Loading أو Success أو Error) قد تحتاج لبيانات مختلفة تمامًا. كلا النوعين يتيح استخدام when التعبيري بصورة حصرية وشاملة (Exhaustive) دون الحاجة لفرع else.
مثال بالكود
sealed interface UiState {
data object Loading : UiState
data class Success(val data: List<String>) : UiState
data class Error(val exception: Throwable) : UiState
}
fun render(state: UiState) = when (state) {
is UiState.Loading -> showProgressBar()
is UiState.Success -> showList(state.data)
is UiState.Error -> showError(state.exception.message)
// لا حاجة لـ else لأن جميع الحالات مغطاة بالكامل
}أخطاء شائعة
- استخدام Enum لحالات تحتاج بيانات متغيرة مثل رسالة الخطأ أو قائمة البيانات.
- إضافة فرع else غير ضروري في when مع Sealed Classes، مما يحرم المطور من تنبيه المترجم عند إضافة حالة جديدة لاحقًا.