გთხოვთ, მითხრათ Kotlin-ის მონაცემთა კლასებსა და sealed კლასებზე.
sobes.tech AI
პასუხი AI-სგან
Kotlin-ში მონაცემთა კლასები გამოიყენება მონაცემების შენახვისთვის. ისინი ავტომატურად ქმნიან სასარგებლო მეთოდებს equals(), hashCode(), toString(), copy(), ასევე დესტრუქციული კომპონენტებს.
// მონაცემთა კლასის მაგალითი
data class User(val name: String, val age: Int)
Sealed კლასები გამოიყენება შეზღუდული კლასების ჰიერქიის წარმოდგენისთვის. ყველა ქვკლასი უნდა იყოს განსაზღვრული იმავე ფაილში, სადაც თავად sealed კლასი (Kotlin 1.5+-ში ეს შეზღუდვა მსუბუქია). ეს საშუალებას აძლევს კომპილატორს დარწმუნდეს ქვკლასების სრული გამოკვლევით, მაგალითად, when გამოთქმაში.
// sealed კლასის მაგალითი
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
object Loading : Result()
}
// მაგალითი sealed კლასის გამოყენებით `when` გამოთქმაში
fun processResult(result: Result) {
when (result) {
is Result.Success -> println("წარმატება: ${result.data}")
is Result.Error -> println("შეცდომა: ${result.message}")
Result.Loading -> println("იტვირთება...")
}
}
ძირითადი განსხვავებები:
- დანიშნულება: მონაცემთა კლასები - მონაცემების შენახვა, sealed კლასები - კლასების ჰიერქიის შეზღუდვა.
- გენერირებული მეთოდები: მონაცემთა კლასები ქმნიან სტანდარტულ მეთოდებს მონაცემებისთვის, sealed კლასები - არა.
- ქვკლასების შეზღუდვა: sealed კლასები იძლევა შეზღუდვებს ქვკლასების განცხადებაზე, მონაცემთა კლასები - არა.
whenსრული გამოკვლევა: Kotlin-ის კომპილატორი შეუძლია გადაამოწმოს ქვკლასების სრული გამოკვლევაwhen-ში, გარეშეelse-ის ბლოკის.
ორივე, sealed და მონაცემთა კლასები, შეიძლება იყოს აბსტრაქტული, თუმცა მონაცემთა კლასები არ შეიძლება იყოს open (რადგან ისინი ფინალად ითვლება დეფოლტად) და პირდაპირ არ შეუძლიათ განახორციელონ open მეთოდები (მხოლოდ ინტერფეისების ან აბსტრაქტული კლასების მეშვეობით). Sealed კლასები დეფოლტად აბსტრაქტული არიან, და მათი კონსტრუქტორები პრივატულია.