Sealed Class — bu nədir, iş prinsipi və tətbiqi

Müəllif: IT Sectr Dərc olunub: 2026-05-26 Oxuma vaxtı: 8 dəq

Sealed Class — Kotlin dilində miras iyerarxiyasını müəyyən alt növlər dəsti ilə məhdudlaşdıran xüsusi sinif növü. Bütün varislər eyni faylda elan edilir və kompilyatora məlumdur, bu da məcburi else qolu olmadan tam when blokundan istifadə etməyə imkan verir. Kotlin Docs, 2026-ya görə, möhürlənmiş siniflər — vəziyyətlər, xəta növləri və UI hadisələri kimi məhdud iyerarxiyaları təmsil etmək üçün əsas mexanizmdir.

Əsas məqamlar

  • Sealed Class — eyni faylda elan edilmiş sabit varislər dəsti olan sinif.
  • Exhaustive when — kompilyator bütün alt növlərin işləndiyini yoxlayır, unudulmuş else qollarını aradan qaldırır.
  • Sealed interface — Kotlin 1.5+ çoxlu miras üçün möhürlənmiş interfeysləri dəstəkləyir.
  • Xəta iyerarxiyası — sealed class Kotlin-də tip-təhlükəsiz xəta idarəetməsinin standart üsuludur.
  • Enum-dan fərqi — sealed class-ın hər bir varisi unikal vəziyyət və müxtəlif sayda sahələr ehtiva edə bilər.

Sealed Class nədir?

Sealed Class (möhürlənmiş sinif) — Kotlin dilində sealed modifikatoru ilə işarələnmiş sinifdir. O, məhdud tip iyerarxiyasını təyin edir: bütün mümkün varislər eyni faylda sadalanır və kompilyator onların hər biri haqqında bilir. Bu, sealed class-ı adi açıq sinifdən fərqləndirir, çünki açıq sinfin varisləri hər yerdə elan edilə bilər.

Sealed class-ın əsas məqsədi — sonlu variantlar dəstinin tip-təhlükəsiz təsviridir. Hər bir varis öz məlumat strukturuna malik ola bilər, bu da sealed class-ı enum-dan daha çevik edir. İcra zamanı sealed class adi abstrakt sinifdir, kompilyator məhdudiyyətləri yalnız kompilasiya mərhələsində tətbiq edir.

Sealed class xüsusilə Android arxitekturasında faydalıdır: UI vəziyyətləri, şəbəkə sorğularının nəticələri, naviqasiya Intent hadisələri və əlbəttə ki, xəta iyerarxiyaları — tipik tətbiq ssenariləri.

Kompilasiya zamanı sealed class when ifadələri üçün keçid cədvəlinə optimallaşdırılır, bu da onu if-else zəncirlərindən daha səmərəli edir. Data class ilə birlikdə hər bir varis yalnız vəziyyəti deyil, həm də metodları ehtiva edə bilər ki, bu da boilerplate kodu olmadan özünü sənədləşdirən domen modelləri qurmağa imkan verir.

Sealed class həmçinin mobil tətbiqlərdə sonlu avtomatları (state machine) təmsil etmək üçün effektivdir. Hər bir vəziyyət — unikal parametrləri olan ayrıca varis, vəziyyətlər arasında keçidlər isə when ifadəsi ilə idarə olunur. Kompilyator bütün mümkün vəziyyətlərin işləndiyinə zəmanət verir ki, bu da UI vəziyyətinin və ya biznes məntiqinin dəyişməsi zamanı icra səhvlərini aradan qaldırır.

Sealed Class və Enum: əsas fərqlər

Başlanğıc Kotlin proqramçıları tez-tez sealed class ilə enum-u qarışdırırlar, çünki hər ikisi dəyərlər dəstini məhdudlaşdırır. Lakin onlar arasında əsaslı fərq var: enum — bir tipin sabitlər dəsti, sealed class — müxtəlif tiplərin iyerarxiyasıdır.

Nə vaxt enum seçməli

Enum bütün variantlar əlavə strukturu olmayan sabitlər olduqda optimaldır. Məsələn, həftənin günləri, sifariş statusları və ya parametrsiz hərəkət növləri. Hər bir enum dəyəri sabit adı olan singleton-dur.

Nə vaxt sealed class seçməli

Sealed class hər bir variantın öz məlumatları olduqda lazımdır. Məsələn, şəbəkə xətası cavab kodunu, parsingsəhvi detalları, avtorizasiya xətası isə mesajı ehtiva edir. Sealed class-ın hər bir varisi unikal sahələri olan ayrıca tipdir.

kotlin
// Enum — bir tipin bütün variantları
enum class Status { LOADING, SUCCESS, ERROR }

// Sealed class — hər bir variant öz məlumatları ilə
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 və Sealed Class

Kotlin 1.5-dən etibarən sealed interface elan etmək mümkündür. Bu, sealed konsepsiyasını interfeyslərə genişləndirir: sealed interface də sabit tətbiq dəstinə malikdir, lakin çoxlu mirası dəstəkləyir.

Nə vaxt sealed interface istifadə etməli

Sealed interface varislər eyni anda bir neçə müqaviləni tətbiq etməli olduqda rahatdır. Məsələn, UI hadisəsi eyni anda kliklənə bilən və izlənilə bilən ola bilər. Sealed class ilə bir əsas sinif seçmək lazım gələrdi, sealed interface ilə varis hər ikisini tətbiq edir.

Sealed class-ın məhdudiyyətləri

Sealed class sinif olduğu üçün hər bir varisin yalnız bir valideyni ola bilər. Sealed interface bu problemi həll edir, lakin vəziyyət saxlaya bilməz. Onlar arasında seçim tapşırıqdan asılıdır: sahələrlə ümumi məntiq lazımdırsa — sealed class, müqavilələrin çevikliyi lazımdırsa — 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>
}

// Varis hər iki interfeysi tətbiq edir
data class LoginClicked(
    override val name: String = "login_click",
    override val params: Map<String, Any> = emptyMap()
) : ScreenEvent, AnalyticsEvent

Mobil inkişafda xəta iyerarxiyası üçün Sealed Class

Sealed class-ın mobil inkişafda əsas tətbiqlərindən biri — tip-təhlükəsiz xəta iyerarxiyasıdır. Müxtəlif növ istisnaları atmaq və ya ümumi Exception istifadə etmək əvəzinə, sealed class bütün mümkün domen xətalarını bir tipdə toplayır.

Xəta iyerarxiyasını necə qurmaq

DomainError sealed class-ı yaradın və bütün nasazlıq növlərini varis kimi sadalayın. Hər bir varis yalnız müəyyən xəta növü üçün məna kəsb edən məlumatları ehtiva edir. Kompilyator xətanı idarə edərkən heç bir variantı unutmayacağınıza zəmanət verir.

Nümunə: autentifikasiya xətalarının idarə edilməsi

Avtorizasiyası olan tətbiqi nəzərdən keçirək, burada müxtəlif nasazlıq ssenariləri mümkündür: səhv şifrə, hesabın bloklanması, server problemi. Sealed class onları hərtərəfli idarəetmə ilə vahid tipdə birləşdirir.

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 ->
        "Qalan cəhdlər: ${3 - error.attempts}"
    is AuthError.AccountBlocked ->
        "Giriş ${Date(error.until)}-dək bloklanıb"
    is AuthError.NetworkFailure ->
        "Bağlantınızı yoxlayın: ${error.cause.localizedMessage}"
    AuthError.ServerError ->
        "Server müvəqqəti olaraq əlçatan deyil"
}

Android-də Sealed Class istifadə qaydaları

Sealed class Android tətbiqlərinin arxitekturasında standart alətə çevrilmişdir. Mobil inkişafda sealed class-ın əvəzolunmaz olduğu üç əsas qaydanı nəzərdən keçirək.

  • UI State — ekranın sonlu avtomat kimi təsviri: Loading, Content, Error. Hər bir vəziyyət öz məlumatlarını ehtiva edir, sealed class isə bütün keçidlərin işləndiyinə zəmanət verir.
  • Navigation Event — naviqasiya sabitləri əvəzinə sealed class: hər bir ekran marşrut parametrləri ilə ayrıca varisdir. Kompilyator arqument tiplərini yoxlayır.
  • Action/Intent — Unidirectional Data Flow qaydası istifadəçinin ekranda yerinə yetirə biləcəyi bütün hərəkətləri təmsil etmək üçün sealed class-dan istifadə edir.

Ayrıca qeyd etmək lazımdır ki, sealed class Clean Architecture-da tətbiq olunur. Hər bir təbəqə (data, domain, presentation) öz xəta növləri üçün sealed class-dan istifadə edir, mapper-lər isə bir sealed class-ı digərinə çevirir. Məsələn, Data məlumat təbəqəsindən DataError biznes məntiqi üçün DomainError-a, sonra isə presentation təbəqəsi üçün UiState-ə çevrilir. Bu, tətbiqin bütün səviyyələrində tip təhlükəsizliyini qoruyur və heç bir xətanın işlənməmiş qalmamasına zəmanət verir.

Sealed class iyerarxiyalarının test edilməsi

Test etmə sealed class xüsusi yanaşma tələb edir, çünki hər bir varis öz vəziyyəti olan ayrıca tipdir. Sealed class-ın bütün varislərindən keçən parametrləşdirilmiş testlər yazmaq tövsiyə olunur. Bu, when ifadələrinin iyerarxiya genişləndirilərkən əlavə olunan yeniləri də daxil olmaqla bütün variantları əhatə etməsinə zəmanət verir.

UI testləri üçün sealed class UiState kimi hər bir vəziyyətin göstərilməsini yoxlamağa imkan verir: Loading spinnere, Content — məlumatlara, Error — xəta mesajına uyğundur. Sealed class sonlu olduğu üçün bütün vəziyyətlərin test əhatəsi UI məntiqinin düzgünlüyünə tam əminlik verir.

Sealed Class ilə işdə tipik səhvlər

Konsepsiyanın sadəliyinə baxmayaraq, proqramçılar sealed class iyerarxiyalarını layihələşdirərkən mütəmadi olaraq səhvlərə yol verirlər. Əsas problemləri və onlardan qaçma yollarını nəzərdən keçirək.

  • Müxtəlif fayllarda varislər — kompilyator sealed class-ı elan etməyə icazə verməz, əgər varislər fayldan kənardadırsa. Bu məhdudiyyət tam when-i təmin edir.
  • Sealed və open-i qarışdırmaq — sealed class eyni anda open ola bilməz. Genişləndirilə bilən iyerarxiya lazımdırsa, adi abstract class istifadə edin, lakin exhaustiveness-dən imtina edəcəksiniz.
  • Həddindən artıq iç-içə yerləşdirmə — sealed class daxilində sealed class dərin iyerarxiya yaradır ki, onu saxlamaq çətindir. Sadə ssenarilər üçün iki səviyyə kifayətdir.
  • When-də unudulmuş else — əgər kitabxanadan sealed class exhaustiveness-ə malik deyilsə, kompilyator buraxılmış qol barədə xəbərdarlıq etməyəcək. Else-i yalnız şüurlu şəkildə əlavə edin.

Tez-tez verilən suallar

Sealed class abstrakt metodlara malik ola bilərmi?

Bəli, sealed class abstrakt metodlar ehtiva edə bilər və hər bir varis onları tətbiq etməlidir. Bu, bütün variantların vahid interfeys təqdim etməli olduğu, lakin fərqli icra məntiqi ilə işlədiyi hallarda rahatdır.

Sealed class Java-da mövcuddurmu?

Java 17+-də sealed modifikatoru ilə möhürlənmiş siniflər və interfeyslər meydana çıxdı. Android hazırda Java 17-ni qismən dəstəkləyir, lakin Kotlin layihələrində sealed class Kotlin 1.0-dan məhdudiyyətsiz mövcuddur.

Sealed class başqa sealed class-dan miras ala bilərmi?

Bəli, bir sealed class digərinin varisi ola bilər. Sealed class iyerarxiyası sonlu qalır: kompilyator hər səviyyədə bütün varisləri bilir. Bu, ətraflı xəta təsnifatları qurmağa imkan verir.

Sealed class performansa təsir edirmi?

Sealed class icra zamanı əlavə yük yaratmır. Kompilyator sealed class ilə when ifadələrini keçid cədvəllərinə (tableswitch) optimallaşdırır ki, bu da if-else zəncirlərindən daha sürətlidir. Performans enum ilə eynidir.

Sealed class iyerarxiyalarını necə test etməli?

Sealed class-ın hər bir varisi ayrıca test edilir. Sealed class sonlu olduğu üçün bütün variantlardan keçən parametrləşdirilmiş test yazmaq olar. Bu, when bloklarının budaqlarının tam əhatəsini təmin edir.

Xülasə

  • Sealed class — bir faylda elan edilmiş sabit varislər dəsti olan sinif, bu da kompilasiya mərhələsində tam when təhlili verir.
  • Sealed class-ın hər bir varisi öz məlumat strukturuna malik ola bilər — bu, enum-dan əsas fərqdir, burada bütün variantlar bir tipin sabitləridir.
  • Sealed interface (Kotlin 1.5+) çoxlu mirası dəstəkləyir, sealed class — yalnız tək mirası. Seçim ümumi vəziyyətə ehtiyacdan asılıdır.
  • Sealed class — Kotlin-də tip-təhlükəsiz xəta iyerarxiyası üçün standart mexanizm: hər bir nasazlıq növü müvafiq sahələri olan ayrıca varisdir.
  • Android-də əsas qaydalar: UI State, Navigation EventAction/Intent — emal tamlığına zəmanət üçün sealed class üzərində qurulur.
  • Müxtəlif fayllarda varislərdən, həddindən artıq iç-içə yerləşdirmədən və sealed ilə open-i qarışdırmaqdan çəkinin — bu, sonlu iyerarxiya müqaviləsini pozur.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun