Kotlin-də tiplərin təhlükəsizliyini necə təmin etmək olar?
sobes.tech Süni İntellekt
AI-dan cavab
Kotlin-də tiplərin təhlükəsizliyi bir neçə əsas mexanizm vasitəsilə tərtib zamanı təmin edilir:
-
Null olmayan tiplər sistemi: Kotlin,
nullqəbul edə bilən referens tiplər ilə?ilə göstərilən və qəbul edə bilməyən tiplər arasında fərq qoyur. Kompilyator açıqnullyoxlamaları və ya təhlükəsiz çağırışlar (?.) və operatorlar (?:,!!) istifadə etməyi tələb edir.// Null olmayan referans val nonNullableString: String = "Hello" // Null ola bilən referans var nullableString: String? = "World" nullableString = null // İcazə verilir // Kompilyasiya xətası: null işlənməsi tələb olunur // val length = nullableString.length // Təhlükəsiz çağırış val length: Int? = nullableString?.length // Elvis operatoru val safeLength: Int = nullableString?.length ?: 0 -
Ağıllı tipə çevirmələr (Smart Casts): Kompilyator,
if,when,while,forvə digər ifadələrdə tip və yanullyoxlamasından sonra avtomatik olaraq dəyişən tipini dəyişir.fun printLength(obj: Any) { if (obj is String) { // Bu blokda, kompilyator obj-in String olduğunu bilir println("String uzunluğu ${obj.length}") } } fun processNullableString(str: String?) { if (str != null) { // Bu blokda, kompilyator str-in null olmadığını bilir println("String null deyil, uzunluğu ${str.length}") } } -
Ümumi tiplər (Generics): Kotlin, müxtəlif tiplərlə işləyən və tiplərin təhlükəsizliyini təmin edən siniflər, interfeyslər və funksiyalar yaratmağa imkan verən ümumi tipləri dəstəkləyir.
class Box<T>(val item: T) fun printItem(box: Box<String>) { // Kompilyator, item-in String olduğunu bilir println(box.item.uppercase()) } -
Kovariantlıq (
out) və kontravariantlıq (in): Bu, alt tiplərin ümumi tiplərdə necə istifadə oluna biləcəyini müəyyən etməyə imkan verir və tiplər arasında uyğunsuzluq xətalarını qarşısını alır.interface Source<out T> { fun nextT(): T // fun consumeT(t: T) // Kompilyator xətası } interface Sink<in T> { // fun produceT(): T // Kompilyator xətası fun consumeT(t: T) } -
Sealed siniflər: Məhdudlaşdırılmış sinif hierarxiyasını təmsil edir, burada bütün alt siniflər tərtib zamanı məlumdur. Bu, kompilyatorun
whenifadələrinin tamlığını yoxlamasına imkan verir və bütün mümkün halların işlənməsini təmin edir.sealed class Result { data class Success(val data: String) : Result() data class Error(val code: Int) : Result() } fun handleResult(result: Result) { when (result) { is Result.Success -> println("Məlumat: ${result.data}") is Result.Error -> println("Xəta: ${result.code}") // 'else' olmadan, kompilyator bütün alt siniflərin işlənməsini təmin edir } }
Bu mexanizmlər birlikdə işləyərək, tiplərlə əlaqəli çoxsaylı potensial səhvləri erkən mərhələdə aşkar etməyə imkan verir, tətbiqin işlədilməsindən əvvəl.