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