Sealed Class Kotlin میں ایک خاص قسم کی کلاس ہے جو وراثت کے درجہ بندی کو ذیلی اقسام کے ایک مقررہ سیٹ تک محدود کرتی ہے۔ تمام ذیلی اقسام ایک ہی فائل میں اعلان کردی جاتی ہیں اور کمپائلر کو معلوم ہوتی ہیں، جو لازمی else شاخ کے بغیر ایک مکمل when بلاک استعمال کرنے کی اجازت دیتی ہیں۔ Kotlin Docs, 2026 کے مطابق، سیل کلاسز محدود درجہ بندیوں جیسے کہ حالتوں، خرابی کی اقسام اور UI واقعات کو پیش کرنے کے لیے ایک اہم طریقہ کار ہیں۔
اہم نکات
Sealed Class (سیل کلاس) Kotlin میں ایک کلاس ہے جسے sealed موڈیفائر سے نشان زد کیا جاتا ہے۔ یہ ایک محدود قسم کا درجہ بندی بیان کرتی ہے: تمام ممکنہ ذیلی اقسام ایک ہی فائل میں درج ہوتی ہیں اور کمپائلر ان میں سے ہر ایک کے بارے میں جانتا ہے۔ یہ sealed class کو عام اوپن کلاس سے ممتاز کرتا ہے جس کی ذیلی اقسام کہیں بھی اعلان کی جا سکتی ہیں۔
Sealed class کا بنیادی مقصد متغیرات کے ایک محدود سیٹ کی ٹائپ سیف نمائندگی ہے۔ ہر ذیلی قسم کا اپنا ڈیٹا ڈھانچہ ہو سکتا ہے، جو sealed class کو enum سے زیادہ لچکدار بناتا ہے۔ رن ٹائم پر، sealed class ایک عام تجریدی کلاس ہے؛ کمپائلر صرف کمپائل ٹائم پر پابندیاں لگاتا ہے۔
Sealed class خاص طور پر Android ایپ آرکیٹیکچر میں مفید ہے: UI حالتیں، نیٹ ورک کی درخواستوں کے نتائج، Intent جیسے نیویگیشن واقعات، اور یقیناً خرابی کے درجہ بندی — عام استعمال کے معاملات ہیں۔
کمپائل ٹائم پر، sealed class کو when اظہار کے لیے جمپ ٹیبل میں بہتر بنایا جاتا ہے، جو اسے if-else زنجیروں سے زیادہ موثر بناتا ہے۔ data class کے ساتھ مل کر، ہر ذیلی قسم نہ صرف حالت بلکہ طریقے بھی رکھ سکتی ہے، جو بوائلر پلیٹ کوڈ کے بغیر خود دستاویزی ڈومین ماڈل بنانے کی اجازت دیتی ہے۔
Sealed class موبائل ایپلیکیشنز میں اسٹیٹ مشینوں کو پیش کرنے کے لیے بھی موثر ہے۔ ہر حالت منفرد پیرامیٹرز کے ساتھ ایک علیحدہ ذیلی قسم ہے، اور حالتوں کے درمیان منتقلی when اظہار کے ذریعے کنٹرول کی جاتی ہے۔ کمپائلر ضمانت دیتا ہے کہ تمام ممکنہ حالتوں کو ہینڈل کیا گیا ہے، UI حالت یا کاروباری منطق کو تبدیل کرتے وقت رن ٹائم خرابیوں کو ختم کرتا ہے۔
ابتدائی Kotlin ڈویلپرز اکثر sealed class اور enum کو الجھاتے ہیں، کیونکہ دونوں اقدار کے سیٹ کو محدود کرتے ہیں۔ تاہم، ایک بنیادی فرق ہے: enum ایک ہی قسم کے مستقلات کا ایک سیٹ ہے، جبکہ sealed class مختلف اقسام کا درجہ بندی ہے۔
Enum اس وقت بہترین ہے جب تمام متغیرات اضافی ڈھانچے کے بغیر مستقلات ہوں۔ مثال کے طور پر، ہفتے کے دن، آرڈر کی حالتیں، یا پیرامیٹرز کے بغیر عمل کی اقسام۔ ہر enum قدر ایک مقررہ نام کے ساتھ سنگلٹن ہے۔
Sealed class اس وقت ضروری ہے جب ہر متغیر کا اپنا ڈیٹا ہو۔ مثال کے طور پر، نیٹ ورک کی خرابی میں جوابی کوڈ ہوتا ہے، پارسنگ کی خرابی میں تفصیلات ہوتی ہیں، اور اجازت کی خرابی میں پیغام ہوتا ہے۔ sealed class کا ہر ذیلی قسم منفرد فیلڈز کے ساتھ ایک علیحدہ قسم ہے۔
// Enum — ایک ہی قسم کے تمام متغیرات
enum class Status { LOADING, SUCCESS, ERROR }
// Sealed class — ہر متغیر اپنے ڈیٹا کے ساتھ
sealed class UiState<out T> {
object Loading : UiState<Nothing>()
data class Success<T>(val data: T) : UiState<T>()
data class Error(val message: String) : UiState<Nothing>()
}
Kotlin 1.5 سے، sealed interface اعلان کرنا ممکن ہے۔ یہ سیل کے تصور کو انٹرفیس تک بڑھاتا ہے: sealed interface میں بھی نفاذ کا ایک مقررہ سیٹ ہوتا ہے لیکن یہ متعدد وراثت کو سپورٹ کرتا ہے۔
Sealed interface اس وقت آسان ہے جب ذیلی اقسام کو ایک ساتھ متعدد معاہدے نافذ کرنے کی ضرورت ہو۔ مثال کے طور پر، ایک UI واقعہ ایک ہی وقت میں کلک کرنے کے قابل اور ٹریک کرنے کے قابل ہو سکتا ہے۔ sealed class کے ساتھ، آپ کو ایک بنیادی کلاس منتخب کرنا ہوگی؛ sealed interface کے ساتھ، ذیلی قسم دونوں کو نافذ کرتی ہے۔
Sealed class ایک کلاس ہے، لہذا ہر ذیلی قسم کا صرف ایک والدین ہو سکتا ہے۔ Sealed interface اس مسئلے کو حل کرتا ہے لیکن حالت پر مشتمل نہیں ہو سکتا۔ ان کے درمیان انتخاب کام پر منحصر ہے: فیلڈز کے ساتھ مشترکہ منطق کی ضرورت ہے — sealed class استعمال کریں؛ معاہدے کی لچک کی ضرورت ہے — sealed interface استعمال کریں۔
sealed interface ScreenEvent {
data class Refresh(val force: Boolean) : ScreenEvent
data class Navigate(val route: String) : ScreenEvent
data class ShowError(val toast: String) : ScreenEvent
}
sealed interface AnalyticsEvent {
val name: String
val params: Map<String, Any>
}
// ذیلی قسم دونوں انٹرفیس کو نافذ کرتی ہے
data class LoginClicked(
override val name: String = "login_click",
override val params: Map<String, Any> = emptyMap()
) : ScreenEvent, AnalyticsEvent
موبائل ڈویلپمنٹ میں sealed class کے اہم استعمال میں سے ایک ٹائپ سیف خرابی کا درجہ بندی ہے۔ مختلف اقسام کی مستثنیات پھینکنے یا عام Exception استعمال کرنے کے بجائے، sealed class تمام ممکنہ ڈومین خرابیوں کو ایک ہی قسم میں جمع کرتی ہے۔
ایک sealed class DomainError بنائیں اور تمام ناکامی کی اقسام کو ذیلی قسم کے طور پر درج کریں۔ ہر ذیلی قسم میں صرف وہ ڈیٹا ہوتا ہے جو اس مخصوص خرابی کی قسم کے لیے متعلقہ ہے۔ کمپائلر ضمانت دیتا ہے کہ خرابی کو ہینڈل کرتے وقت آپ کوئی متغیر نہیں بھولیں گے۔
ایک ایپلیکیشن پر غور کریں جہاں مختلف ناکامی کے منظرنامے ممکن ہیں: غلط پاس ورڈ، اکاؤنٹ مسدود، سرور کا مسئلہ۔ Sealed class انہیں مکمل ہینڈلنگ کے ساتھ ایک ہی قسم میں یکجا کرتی ہے۔
sealed class AuthError {
data class InvalidCredentials(
val attempts: Int
) : AuthError()
data class AccountBlocked(
val until: Long
) : AuthError()
data class NetworkFailure(
val cause: Throwable
) : AuthError()
object ServerError : AuthError()
}
fun handleError(error: AuthError): String = when (error) {
is AuthError.InvalidCredentials ->
"باقی کوششیں: ${3 - error.attempts}"
is AuthError.AccountBlocked ->
"${Date(error.until)} تک رسائی مسدود"
is AuthError.NetworkFailure ->
"کنکشن چیک کریں: ${error.cause.localizedMessage}"
AuthError.ServerError ->
"سرور عارضی طور پر دستیاب نہیں"
}
Sealed class Android ایپلیکیشن آرکیٹیکچر میں ایک معیاری ٹول بن گیا ہے۔ آئیے تین اہم پیٹرن دیکھتے ہیں جہاں موبائل ڈویلپمنٹ میں sealed class ناگزیر ہے۔
Clean Architecture میں sealed class کے استعمال پر بھی غور کرنا چاہیے۔ ہر پرت (data, domain, presentation) اپنی خرابی کی اقسام کے لیے sealed class استعمال کرتی ہے، اور میپر ایک sealed class کو دوسری میں تبدیل کرتے ہیں۔ مثال کے طور پر، ڈیٹا پرت سے DataError کاروباری منطق کے لیے DomainError میں اور پھر پریزنٹیشن پرت کے لیے UiState میں میپ ہوتا ہے۔ یہ ایپلیکیشن کی تمام سطحوں پر ٹائپ سیفٹی کو محفوظ رکھتا ہے اور ضمانت دیتا ہے کہ کوئی بھی خرابی بغیر ہینڈل نہیں رہتی۔
جانچ کے لیے sealed class کو ایک خاص نقطہ نظر کی ضرورت ہوتی ہے، کیونکہ ہر ذیلی قسم اپنی حالت کے ساتھ ایک علیحدہ قسم ہے۔ سفارش کی جاتی ہے کہ پیرامیٹرائزڈ ٹیسٹ لکھیں جو sealed class کی تمام ذیلی اقسام پر گزرتے ہوں۔ یہ ضمانت دیتا ہے کہ when اظہار درجہ بندی کو بڑھاتے وقت شامل کردہ نئے سمیت تمام متغیرات کو کور کرتے ہیں۔
UI ٹیسٹ کے لیے، sealed class کو UiState کے طور پر استعمال کرنے سے ہر حالت کی نمائش کی جانچ کی جا سکتی ہے: Loading اسپنر دکھاتا ہے، Content ڈیٹا دکھاتا ہے، Error خرابی کا پیغام دکھاتا ہے۔ چونکہ sealed class محدود ہے، تمام حالتوں کے ٹیسٹ کوریج UI منطق کی درستگی میں مکمل اعتماد دیتا ہے۔
تصور کی سادگی کے باوجود، ڈویلپرز sealed class درجہ بندی ڈیزائن کرتے وقت باقاعدگی سے غلطیاں کرتے ہیں۔ آئیے اہم مسائل اور ان سے بچنے کے طریقے دیکھتے ہیں۔
اکثر پوچھے گئے سوالات
ہاں، sealed class میں تجریدی طریقے ہو سکتے ہیں، اور ہر ذیلی قسم انہیں نافذ کرنے کی پابند ہے۔ یہ اس وقت آسان ہے جب تمام متغیرات کو ایک مشترکہ انٹرفیس فراہم کرنا ہو لیکن مختلف عملدرآمد منطق کے ساتھ۔
Java 17+ میں، sealed موڈیفائر کے ساتھ سیل کلاسز اور انٹرفیس متعارف کرائے گئے ہیں۔ Android فی الحال Java 17 کو جزوی طور پر سپورٹ کرتا ہے، لیکن Kotlin منصوبوں میں، sealed class Kotlin 1.0 سے بغیر کسی پابندی کے دستیاب ہے۔
ہاں، ایک sealed class دوسری کی ذیلی قسم ہو سکتی ہے۔ sealed class کا درجہ بندی محدود رہتا ہے: کمپائلر ہر سطح پر تمام ذیلی اقسام کو جانتا ہے۔ یہ تفصیلی خرابی کی درجہ بندی بنانے کی اجازت دیتا ہے۔
Sealed class رن ٹائم پر کوئی اضافی بوجھ نہیں بناتی۔ کمپائلر sealed class کے ساتھ when اظہار کو جمپ ٹیبل (tableswitch) میں بہتر بناتا ہے، جو if-else زنجیروں سے تیز ہے۔ کارکردگی enum جیسی ہے۔
Sealed class کا ہر ذیلی قسم علیحدہ طور پر جانچا جاتا ہے۔ چونکہ sealed class محدود ہے، آپ ایک پیرامیٹرائزڈ ٹیسٹ لکھ سکتے ہیں جو تمام متغیرات پر گزرتا ہے۔ یہ when بلاک کی شاخوں کا مکمل کوریج فراہم کرتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں