sealed class و sealed interface در Kotlin مکانیسمهای سلسلهمراتب محدود نوع هستند که در آن همه زیرکلاسهای ممکن در زمان کامپایل شناخته شدهاند. برخلاف کلاسهای انتزاعی معمولی، sealed class پردازش جامع همه گزینهها در عبارت when را تضمین میکند. طبق مستندات JetBrains Kotlin Language Guide (2026)، انواع sealed اساس مدلسازی حالات، صفحههای UI و انواع نتیجه در پروژههای Kotlin هستند.
نکات اصلی
sealed class یک کلاس انتزاعی با محدودیت است: همه زیرکلاسهای مستقیم آن باید در همان فایلی که sealed class اعلام شده است، اعلام شوند. این محدودیت سلسلهمراتب را بسته (sealed) میکند — هیچ کدی خارج از فایل نمیتواند زیرکلاس جدیدی اضافه کند.
sealed interface که در Kotlin 1.5 اضافه شده، همان تضمین را با انعطافپذیری اینترفیس ارائه میدهد: sealed interface میتواند توسط چندین کلاس، شیء یا اینترفیس دیگر در یک فایل پیادهسازی شود. برخلاف sealed class، sealed interface محدودیت ارثبری تکی ندارد — یک کلاس میتواند چندین sealed interface را همزمان پیادهسازی کند.
بر اساس Kotlin Evolution and Roadmap (2026)، sealed interface به درخواست جامعه برای مدلسازی انعطافپذیرتر اضافه شده است. انگیزه اصلی امکان ترکیب سلسلهمراتب نوع مستقل بدون ارثبری چندگانه کلاسها بود.
اعلام sealed class با کلمه کلیدی sealed قبل از class شروع میشود. زیرکلاسها در همان فایل اعلام میشوند.
sealed class NetworkResult {
data class Success(val data: String) : NetworkResult()
data class Error(val message: String) : NetworkResult()
object Loading : NetworkResult()
}
هر زیرکلاس sealed class میتواند ویژگیها و متدهای خاص خود را داشته باشد. Loading یک singleton (object)، Success و Error data class با پارامتر هستند. کامپایلر هر سه گزینه را میداند و کامل بودن آنها را در هنگام استفاده از when بررسی میکند.
sealed کلاسها میتوانند تو در تو باشند و سلسلهمراتب چندسطحی برای مدلهای داده پیچیده بدون از دست دادن امنیت نوع ایجاد کنند.
sealed class UiState {
object Idle : UiState()
object Loading : UiState()
data class Content(val items: List<Item>) : UiState()
data class Error(val exception: Throwable) : UiState()
}
sealed interface مشابه sealed class اعلام میشود، اما امکان پیادهسازی چندین sealed interface را در یک کلاس فراهم میکند.
sealed interface Action
sealed interface Loggable
data class Navigate(val route: String) : Action, Loggable
data class ShowToast(val text: String) : Action
object GoBack : Action, Loggable
کلاس Navigate دو sealed interface — Action و Loggable را همزمان پیادهسازی میکند. برای sealed class این به دلیل محدودیت ارثبری تکی غیرممکن است. sealed interface انعطافپذیری ترکیب سلسلهمراتب مستقل را فراهم میکند.
sealed interface وقتی ارجح است که سلسلهمراتب به حالت یا سازنده مشترک نیاز نداشته باشد. طبق JetBrains Kotlin Guidelines (2026)، sealed interface باید به طور پیشفرض برای همه سلسلهمراتب جدیدی که نیاز به سازنده مشترک ندارند استفاده شود، که کد را برای توسعههای آینده انعطافپذیرتر میکند.
مزیت اصلی انواع sealed پردازش جامع (exhaustive) در عبارت when است. کامپایلر بررسی میکند که همه زیرکلاسهای ممکن در نظر گرفته شدهاند.
fun handleResult(result: NetworkResult): String = when (result) {
is NetworkResult.Success -> "Data: ${result.data}"
is NetworkResult.Error -> "Error: ${result.message}"
is NetworkResult.Loading -> "Loading..."
// else الزامی نیست — کامپایلر میداند که همه انواع پوشش داده شدهاند
}
اگر توسعهدهنده زیرکلاس جدیدی به سلسلهمراتب sealed اضافه کند اما پردازش آن را در when فراموش کند — کامپایلر خطا میدهد. این امنیت در سطح نوع است که با استفاده از سلسلهمراتب باز با شاخه else در دسترس نیست.
بر اساس Google Android Developers (2026)، sealed کلاسها روش توصیهشده برای مدلسازی حالت UI در Jetpack Compose هستند. بررسی جامع when از وضعیتهایی جلوگیری میکند که توسعهدهنده همه گزینههای ممکن نمایش صفحه را پردازش نکرده است.
enum class و sealed class اغلب اشتباه گرفته میشوند، اما اهداف و قابلیتهای متفاوتی دارند.
| ویژگی | sealed class | enum class |
|---|---|---|
| نمونهها | چندین (data class)، یکی (object) | دقیقاً یکی برای هر ثابت |
| ویژگیها | متفاوت برای هر زیرکلاس | یکسان برای همه ثابتها |
| ارثبری | بله (از sealed class) | خیر (implicit final) |
| سازنده | میتواند پارامتر داشته باشد | فقط مشترک برای همه ثابتها |
| سلسلهمراتب | محدود، sealed | مجموعه ثابت ثابتها |
انتخاب بین sealed class و enum class به وظیفه بستگی دارد. اگر گزینهها داده اضافی ندارند — از enum استفاده کنید. اگر هر گزینه شامل فیلدهای منحصربهفرد است — از sealed class یا sealed interface استفاده کنید.
sealed انواع در پروژههای Kotlin برای سناریوهای استانداردی که نیاز به مدلسازی با امنیت نوع دارند استفاده میشوند.
هر صفحه Compose میتواند sealed class UiState داشته باشد که همه حالتهای ممکن را توصیف میکند: Idle, Loading, Content(data), Error(exception). عبارت when تضمین میکند که همه حالتها پردازش شدهاند.
NetworkResult با گزینههای Success, Error, Loading — الگوی استاندارد در پروژههای Kotlin با Retrofit و Ktor است. sealed class پردازش ایمن هر نتیجه درخواست را تضمین میکند.
sealed interface برای مسیرهای ناوبری به ماژولها اجازه میدهد مسیرهای خود را در چارچوب یک سلسلهمراتب واحد اعلام کنند. این خطاهای مربوط به مسیرهای ناشناخته را در زمان کامپایل حذف میکند.
بر اساس KotlinConf (2025)، sealed class و sealed interface اساس طراحی type-safe در برنامههای مدرن Kotlin هستند. آنها با data class برای مدلسازی ساختارهای دامنه پیچیده بدون از دست دادن امنیت در زمان کامپایل ترکیب میشوند.
سوالات متداول
همه زیرکلاسهای مستقیم sealed class باید در همان فایل اعلام شوند. برای sealed interface نیز همین قانون — پیادهسازیها در یک فایل.
خیر، قانون یک فایل برای sealed interface نیز اعمال میشود. همه پیادهسازیها باید در فایلی باشند که sealed interface در آن اعلام شده است.
sealed interface حالت و سازنده ندارد و امکان پیادهسازی چندگانه را فراهم میکند. sealed class میتواند سازنده و حالت مشترک داشته باشد، اما یک کلاس فقط میتواند از یک sealed class ارثبری کند.
کامپایلر کامل بودن when را بررسی میکند: اگر همه زیرکلاسها پردازش نشده باشند، کد کامپایل نمیشود. این خطاهای runtime را حذف میکند و کد را امنتر میکند.
بله، sealed class میتواند سازنده داشته باشد (به طور پیشفرض private). همه زیرکلاسها میتوانند پارامترها را از طریق super() به این سازنده منتقل کنند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید