Sealed Class — یہ کیا ہے، کام کرنے کا اصول اور اطلاق

مصنف: IT Sectr اشاعت: 2026-05-26 مطالعے کا وقت: 8 منٹ

Sealed Class Kotlin میں ایک خاص قسم کی کلاس ہے جو وراثت کے درجہ بندی کو ذیلی اقسام کے ایک مقررہ سیٹ تک محدود کرتی ہے۔ تمام ذیلی اقسام ایک ہی فائل میں اعلان کردی جاتی ہیں اور کمپائلر کو معلوم ہوتی ہیں، جو لازمی else شاخ کے بغیر ایک مکمل when بلاک استعمال کرنے کی اجازت دیتی ہیں۔ Kotlin Docs, 2026 کے مطابق، سیل کلاسز محدود درجہ بندیوں جیسے کہ حالتوں، خرابی کی اقسام اور UI واقعات کو پیش کرنے کے لیے ایک اہم طریقہ کار ہیں۔

اہم نکات

  • Sealed Class — ایک ہی فائل میں اعلان کردہ ذیلی اقسام کے مقررہ سیٹ والی کلاس۔
  • Exhaustive when — کمپائلر چیک کرتا ہے کہ تمام ذیلی اقسام کو ہینڈل کیا گیا ہے، بھولی ہوئی else شاخوں کو ختم کرتا ہے۔
  • Sealed interface — Kotlin 1.5+ متعدد وراثت کے لیے سیل انٹرفیس کو سپورٹ کرتا ہے۔
  • خرابی کا درجہ بندی — sealed class Kotlin میں ٹائپ سیف خرابی ہینڈلنگ کا معیاری طریقہ ہے۔
  • enum سے فرق — sealed class کا ہر ذیلی قسم منفرد حالت اور مختلف تعداد میں فیلڈز رکھ سکتا ہے۔

Sealed Class کیا ہے؟

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 حالت یا کاروباری منطق کو تبدیل کرتے وقت رن ٹائم خرابیوں کو ختم کرتا ہے۔

Sealed Class اور Enum: کلیدی فرق

ابتدائی Kotlin ڈویلپرز اکثر sealed class اور enum کو الجھاتے ہیں، کیونکہ دونوں اقدار کے سیٹ کو محدود کرتے ہیں۔ تاہم، ایک بنیادی فرق ہے: enum ایک ہی قسم کے مستقلات کا ایک سیٹ ہے، جبکہ sealed class مختلف اقسام کا درجہ بندی ہے۔

enum کب منتخب کریں

Enum اس وقت بہترین ہے جب تمام متغیرات اضافی ڈھانچے کے بغیر مستقلات ہوں۔ مثال کے طور پر، ہفتے کے دن، آرڈر کی حالتیں، یا پیرامیٹرز کے بغیر عمل کی اقسام۔ ہر enum قدر ایک مقررہ نام کے ساتھ سنگلٹن ہے۔

sealed class کب منتخب کریں

Sealed class اس وقت ضروری ہے جب ہر متغیر کا اپنا ڈیٹا ہو۔ مثال کے طور پر، نیٹ ورک کی خرابی میں جوابی کوڈ ہوتا ہے، پارسنگ کی خرابی میں تفصیلات ہوتی ہیں، اور اجازت کی خرابی میں پیغام ہوتا ہے۔ sealed class کا ہر ذیلی قسم منفرد فیلڈز کے ساتھ ایک علیحدہ قسم ہے۔

kotlin
// 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>()
}

Sealed Interface بمقابلہ Sealed Class

Kotlin 1.5 سے، sealed interface اعلان کرنا ممکن ہے۔ یہ سیل کے تصور کو انٹرفیس تک بڑھاتا ہے: sealed interface میں بھی نفاذ کا ایک مقررہ سیٹ ہوتا ہے لیکن یہ متعدد وراثت کو سپورٹ کرتا ہے۔

sealed interface کب استعمال کریں

Sealed interface اس وقت آسان ہے جب ذیلی اقسام کو ایک ساتھ متعدد معاہدے نافذ کرنے کی ضرورت ہو۔ مثال کے طور پر، ایک UI واقعہ ایک ہی وقت میں کلک کرنے کے قابل اور ٹریک کرنے کے قابل ہو سکتا ہے۔ sealed class کے ساتھ، آپ کو ایک بنیادی کلاس منتخب کرنا ہوگی؛ sealed interface کے ساتھ، ذیلی قسم دونوں کو نافذ کرتی ہے۔

sealed class کی حدود

Sealed class ایک کلاس ہے، لہذا ہر ذیلی قسم کا صرف ایک والدین ہو سکتا ہے۔ Sealed interface اس مسئلے کو حل کرتا ہے لیکن حالت پر مشتمل نہیں ہو سکتا۔ ان کے درمیان انتخاب کام پر منحصر ہے: فیلڈز کے ساتھ مشترکہ منطق کی ضرورت ہے — sealed class استعمال کریں؛ معاہدے کی لچک کی ضرورت ہے — sealed interface استعمال کریں۔

kotlin
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

موبائل ڈویلپمنٹ میں sealed class کے اہم استعمال میں سے ایک ٹائپ سیف خرابی کا درجہ بندی ہے۔ مختلف اقسام کی مستثنیات پھینکنے یا عام Exception استعمال کرنے کے بجائے، sealed class تمام ممکنہ ڈومین خرابیوں کو ایک ہی قسم میں جمع کرتی ہے۔

خرابی کا درجہ بندی کیسے بنائیں

ایک sealed class DomainError بنائیں اور تمام ناکامی کی اقسام کو ذیلی قسم کے طور پر درج کریں۔ ہر ذیلی قسم میں صرف وہ ڈیٹا ہوتا ہے جو اس مخصوص خرابی کی قسم کے لیے متعلقہ ہے۔ کمپائلر ضمانت دیتا ہے کہ خرابی کو ہینڈل کرتے وقت آپ کوئی متغیر نہیں بھولیں گے۔

مثال: تصدیق کی خرابی کا ہینڈلنگ

ایک ایپلیکیشن پر غور کریں جہاں مختلف ناکامی کے منظرنامے ممکن ہیں: غلط پاس ورڈ، اکاؤنٹ مسدود، سرور کا مسئلہ۔ Sealed class انہیں مکمل ہینڈلنگ کے ساتھ ایک ہی قسم میں یکجا کرتی ہے۔

kotlin
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 ->
        "سرور عارضی طور پر دستیاب نہیں"
}

Android میں Sealed Class کے استعمال کے پیٹرن

Sealed class Android ایپلیکیشن آرکیٹیکچر میں ایک معیاری ٹول بن گیا ہے۔ آئیے تین اہم پیٹرن دیکھتے ہیں جہاں موبائل ڈویلپمنٹ میں sealed class ناگزیر ہے۔

  • UI State — اسکرین کو اسٹیٹ مشین کے طور پر پیش کرنا: Loading, Content, Error۔ ہر حالت اپنا ڈیٹا رکھتی ہے، اور sealed class ضمانت دیتی ہے کہ تمام منتقلیوں کو ہینڈل کیا گیا ہے۔
  • Navigation Event — نیویگیشن مستقلات کے بجائے sealed class: ہر اسکرین راستہ پیرامیٹرز کے ساتھ ایک علیحدہ ذیلی قسم ہے۔ کمپائلر دلیل کی اقسام کی جانچ کرتا ہے۔
  • Action/Intent — Unidirectional Data Flow پیٹرن ان تمام اقدامات کو پیش کرنے کے لیے sealed class استعمال کرتا ہے جو صارف اسکرین پر انجام دے سکتا ہے۔

Clean Architecture میں sealed class کے استعمال پر بھی غور کرنا چاہیے۔ ہر پرت (data, domain, presentation) اپنی خرابی کی اقسام کے لیے sealed class استعمال کرتی ہے، اور میپر ایک sealed class کو دوسری میں تبدیل کرتے ہیں۔ مثال کے طور پر، ڈیٹا پرت سے DataError کاروباری منطق کے لیے DomainError میں اور پھر پریزنٹیشن پرت کے لیے UiState میں میپ ہوتا ہے۔ یہ ایپلیکیشن کی تمام سطحوں پر ٹائپ سیفٹی کو محفوظ رکھتا ہے اور ضمانت دیتا ہے کہ کوئی بھی خرابی بغیر ہینڈل نہیں رہتی۔

Sealed Class درجہ بندی کی جانچ

جانچ کے لیے sealed class کو ایک خاص نقطہ نظر کی ضرورت ہوتی ہے، کیونکہ ہر ذیلی قسم اپنی حالت کے ساتھ ایک علیحدہ قسم ہے۔ سفارش کی جاتی ہے کہ پیرامیٹرائزڈ ٹیسٹ لکھیں جو sealed class کی تمام ذیلی اقسام پر گزرتے ہوں۔ یہ ضمانت دیتا ہے کہ when اظہار درجہ بندی کو بڑھاتے وقت شامل کردہ نئے سمیت تمام متغیرات کو کور کرتے ہیں۔

UI ٹیسٹ کے لیے، sealed class کو UiState کے طور پر استعمال کرنے سے ہر حالت کی نمائش کی جانچ کی جا سکتی ہے: Loading اسپنر دکھاتا ہے، Content ڈیٹا دکھاتا ہے، Error خرابی کا پیغام دکھاتا ہے۔ چونکہ sealed class محدود ہے، تمام حالتوں کے ٹیسٹ کوریج UI منطق کی درستگی میں مکمل اعتماد دیتا ہے۔

Sealed Class کے ساتھ کام کرتے وقت عام غلطیاں

تصور کی سادگی کے باوجود، ڈویلپرز sealed class درجہ بندی ڈیزائن کرتے وقت باقاعدگی سے غلطیاں کرتے ہیں۔ آئیے اہم مسائل اور ان سے بچنے کے طریقے دیکھتے ہیں۔

  • مختلف فائلوں میں ذیلی اقسام — کمپائلر sealed class کے اعلان کی اجازت نہیں دے گا اگر ذیلی اقسام فائل سے باہر ہیں۔ یہ حد مکمل when کو یقینی بناتی ہے۔
  • sealed اور open کا اختلاط — sealed class ایک ہی وقت میں open نہیں ہو سکتی۔ اگر توسیع پذیر درجہ بندی کی ضرورت ہے تو، ایک عام abstract class استعمال کریں، لیکن آپ مکملیت کو قربان کریں گے۔
  • ضرورت سے زیادہ گھوںسلا — sealed class کے اندر sealed class ایک گہرا درجہ بندی بناتا ہے جسے برقرار رکھنا مشکل ہے۔ سادہ منظرناموں کے لیے، دو سطحیں کافی ہیں۔
  • when میں بھولا ہوا else — اگر لائبریری سے sealed class میں مکملیت نہیں ہے، تو کمپائلر غائب شاخ کے بارے میں متنبہ نہیں کرے گا۔ else صرف جان بوجھ کر شامل کریں۔

اکثر پوچھے گئے سوالات

کیا sealed class میں تجریدی طریقے ہو سکتے ہیں؟

ہاں، sealed class میں تجریدی طریقے ہو سکتے ہیں، اور ہر ذیلی قسم انہیں نافذ کرنے کی پابند ہے۔ یہ اس وقت آسان ہے جب تمام متغیرات کو ایک مشترکہ انٹرفیس فراہم کرنا ہو لیکن مختلف عملدرآمد منطق کے ساتھ۔

کیا Java میں sealed class دستیاب ہے؟

Java 17+ میں، sealed موڈیفائر کے ساتھ سیل کلاسز اور انٹرفیس متعارف کرائے گئے ہیں۔ Android فی الحال Java 17 کو جزوی طور پر سپورٹ کرتا ہے، لیکن Kotlin منصوبوں میں، sealed class Kotlin 1.0 سے بغیر کسی پابندی کے دستیاب ہے۔

کیا sealed class کسی اور sealed class سے وراثت حاصل کر سکتی ہے؟

ہاں، ایک sealed class دوسری کی ذیلی قسم ہو سکتی ہے۔ sealed class کا درجہ بندی محدود رہتا ہے: کمپائلر ہر سطح پر تمام ذیلی اقسام کو جانتا ہے۔ یہ تفصیلی خرابی کی درجہ بندی بنانے کی اجازت دیتا ہے۔

کیا sealed class کارکردگی کو متاثر کرتی ہے؟

Sealed class رن ٹائم پر کوئی اضافی بوجھ نہیں بناتی۔ کمپائلر sealed class کے ساتھ when اظہار کو جمپ ٹیبل (tableswitch) میں بہتر بناتا ہے، جو if-else زنجیروں سے تیز ہے۔ کارکردگی enum جیسی ہے۔

Sealed class درجہ بندی کی جانچ کیسے کریں؟

Sealed class کا ہر ذیلی قسم علیحدہ طور پر جانچا جاتا ہے۔ چونکہ sealed class محدود ہے، آپ ایک پیرامیٹرائزڈ ٹیسٹ لکھ سکتے ہیں جو تمام متغیرات پر گزرتا ہے۔ یہ when بلاک کی شاخوں کا مکمل کوریج فراہم کرتا ہے۔

خلاصہ

  • Sealed class — ایک فائل میں اعلان کردہ ذیلی اقسام کے مقررہ سیٹ والی کلاس، جو کمپائل ٹائم پر مکمل when تجزیہ کو قابل بناتی ہے۔
  • Sealed class کا ہر ذیلی قسم اپنا ڈیٹا ڈھانچہ رکھ سکتا ہے — یہ enum سے بنیادی فرق ہے، جہاں تمام متغیرات ایک ہی قسم کے مستقلات ہیں۔
  • Sealed interface (Kotlin 1.5+) متعدد وراثت کو سپورٹ کرتا ہے، sealed class صرف واحد وراثت کو سپورٹ کرتا ہے۔ انتخاب مشترکہ حالت کی ضرورت پر منحصر ہے۔
  • Sealed class Kotlin میں ٹائپ سیف خرابی کے درجہ بندی کے لیے معیاری طریقہ کار ہے: ہر ناکامی کی قسم متعلقہ فیلڈز کے ساتھ ایک علیحدہ ذیلی قسم ہے۔
  • Android میں اہم پیٹرن: UI State، Navigation Event اور Action/Intent — ہینڈلنگ کی مکملیت کو یقینی بنانے کے لیے sealed class پر بنائے گئے ہیں۔
  • مختلف فائلوں میں ذیلی اقسام، ضرورت سے زیادہ گھوںسلا اور sealed کو open کے ساتھ مکس کرنے سے بچیں — یہ محدود درجہ بندی کے معاہدے کی خلاف ورزی کرتا ہے۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں