Middle
Kotlin-ში 'sealed' კლასები რა არის და რა შემთხვევებში უნდა გამოიყენოს?
sobes.tech AI
პასუხი AI-სგან
sealed კლასი გამოიყენება შეზღუდული კლასების მემკვიდრეობის წარმოსადგენად. ყველა პირდაპირი მემკვიდრე sealed კლასის უნდა იყოს განსაზღვრული იმავე ფაილში, სადაც თავად sealed კლასი, ან იმავე მოდულებში (Kotlin 1.5+). ეს საშუალებას აძლევს კომპილატორს გადაამოწმოს, რომ ყველა შესაძლო ქვეტიპი დამუშავებულია when გამოთქმაში, რაც მას სრულყოფილს ხდის else ბლოკის გარეშე:
ძირითადი მახასიათებლები:
- ყველა პირდაპირი ქვესახეობა უნდა იყოს ადგილობრივი:
sealedკლასის კონსტრუქტორი არისprivateროგორც წესი:sealedკლასი არ შეიძლება იყოს აბსტრაქტული:- შექმნის მაგალითებს აკრძალულია:
გამოყენების შემთხვევები:
- შეზღუდული მდგომარეობების ან შედეგების წარმოდგენა. მაგალითად,
Loading,Success(data),Error(message):sealed class Result<out T> { data class Success<T>(val data: T) : Result<T>() data class Error(val message: String) : Result<Nothing>() object Loading : Result<Nothing>() } - შედეგების ვარიანტების დამუშავება
whenგამოთქმაში, სრული შემოწმების გარანტიით:fun processResult(result: Result<String>) { when (result) { is Result.Success -> println("მიღებული მონაცემები: ${result.data}") is Result.Error -> println("შეცდომა: ${result.message}") Result.Loading -> println("იტვირთება...") } // `else` ბლოკი არ არის საჭირო, რადგან კომპილატორი იცის ყველა ქვეტიპი. } - გამოყენება enum-ების ანალოგად, მონაცემების ინკაფსულაციით თითოეულ ვარიანტში:
შედარება enum კლასებთან:
| ხასიათი | enum class |
sealed class |
|---|---|---|
| მაგალითები | შეზღუდული სახელწოდებული კონსტანტების სია | შეზღუდული ტიპების სია |
| მონაცემები ვარიანტებში | არა (მხოლოდ თვისებები) | დიახ (პოდკლასების საშუალებით) |
| აბსტრაქტული წევრები | არა | დიახ |
| მემკვიდრეობა | არა | დიახ, მაგრამ მხოლოდ იმავე ფაილში/მოდულში |