Sobes.tech
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
მაგალითები შეზღუდული სახელწოდებული კონსტანტების სია შეზღუდული ტიპების სია
მონაცემები ვარიანტებში არა (მხოლოდ თვისებები) დიახ (პოდკლასების საშუალებით)
აბსტრაქტული წევრები არა დიახ
მემკვიდრეობა არა დიახ, მაგრამ მხოლოდ იმავე ფაილში/მოდულში