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 स्थितियाँ, नेटवर्क अनुरोध परिणाम, Intents जैसी नेविगेशन घटनाएँ, और निश्चित रूप से त्रुटि पदानुक्रम — विशिष्ट उपयोग मामले हैं।

कंपाइल समय पर, 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें