Sobes.tech
Middle

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:

  1. Null olmayan tiplər sistemi: Kotlin, null qə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çıq null yoxlamaları 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
    
  2. Ağıllı tipə çevirmələr (Smart Casts): Kompilyator, if, when, while, for və digər ifadələrdə tip və ya null yoxlaması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}")
        }
    }
    
  3. Ü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())
    }
    
  4. 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)
    }
    
  5. 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 when ifadə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.