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 (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.
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.
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.
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.
// 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>()
}
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.
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 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.
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
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.
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.
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.
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"
}
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.
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.
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.
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.
Tez-tez verilən suallar
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.
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.
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 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-ı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ə
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.
Həm də oxuyun