Sobes.tech
Middle

Чӣ гуна бехатарии навъҳоро дар Kotlin таъмин кардан мумкин аст?

sobes.tech AI

Ҷавоб аз AI

Амниятиии типҳо дар Kotlin дар вақти компилятсия тавассути чанд механизмҳои калидӣ таъмин карда мешаванд:

  1. Системаи типҳои нол-неъматӣ: Kotlin фарқ мекунад байни типҳои истинодӣ, ки метавонанд арзиши null қабул кунанд (бо ? дар охири номи тип нишон дода мешавад), ва онҳое, ки наметавонанд. Компилятор талаб мекунад, ки барои null санҷишҳои ошкоро ё истифодаи зангҳои бехатартар (?.) ва операторҳо (?:, !!) анҷом дода шаванд.

    // Номусоии, ки наметавонад null бошад
    val nonNullableString: String = "Hello"
    
    // Номусоии, ки метавонад null бошад
    var nullableString: String? = "World"
    nullableString = null // иҷозат дода шудааст
    
    // Хатогии компилятсия: ниёз ба коркарди null
    // val length = nullableString.length
    
    // Зангҳои бехатартар
    val length: Int? = nullableString?.length
    
    // Оператор Elvis
    val safeLength: Int = nullableString?.length ?: 0
    
  2. Smart Casts: Компилятор автоматӣ навъи тағйирёбандаро дар дохили блокҳои if, when, while, for ва дигар ифодаҳо пас аз санҷиши навъ ё null тағйир медиҳад.

    fun printLength(obj: Any) {
        if (obj is String) {
            // Дар дохили ин блок, компилятор медонад, ки obj String аст
            println("Дарозии String: ${obj.length}")
        }
    }
    
    fun processNullableString(str: String?) {
        if (str != null) {
            // Дар дохили ин блок, компилятор медонад, ки str null нест
            println("String не null, дарозӣ: ${str.length}")
        }
    }
    
  3. Типҳои умумӣ (Generics): Kotlin қолабҳоро дастгирӣ мекунад, ки имкон медиҳанд, ки синфҳо, интерфейсҳо ва функсияҳо бо намудҳои гуногун кор кунанд, бо таъмини бехатарии навъҳо дар вақти компилятсия.

    class Box<T>(val item: T)
    
    fun printItem(box: Box<String>) {
        // Компилятор медонад, ки item String аст
        println(box.item.uppercase())
    }
    
  4. Ковариансия (out) ва контравариансия (in): Имкон медиҳанд, ки чӣ гуна подтипҳо дар типҳои умумӣ истифода мешаванд, то хатогиҳои номувофиқии навъҳоро дар вақти компилятсия пешгирӣ кунанд.

    interface Source<out T> {
        fun nextT(): T
        // fun consumeT(t: T) // Хатогӣ дар компилятсия
    }
    
    interface Sink<in T> {
        // fun produceT(): T // Хатогӣ дар компилятсия
        fun consumeT(t: T)
    }
    
  5. Классҳои sealed: Инҳоянд, ки як иерархияи маҳдудро намояндагӣ мекунанд, ки дар вақти компилятсия ҳамаи субклассҳо маълуманд. Ин ба компилятор имкон медиҳад, ки пурра будани изразҳои when бо субклассҳои sealed-ро тафтиш кунад, ва ҳамаи ҳолатҳоро баррасӣ кунад.

    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("Маълумот: ${result.data}")
            is Result.Error -> println("Хатогӣ: ${result.code}")
            // Бе 'else', компилятор кафолат медиҳад, ки ҳамаи субклассҳо баррасӣ шудаанд
        }
    }
    

Ин механизмҳо дар якҷоягӣ кор мекунанд, ва имкон медиҳанд, ки бисёр хатогиҳои эҳтимолиро, ки бо навъҳо алоқаманданд, дар марҳилаи аввали таҳия ошкор кунанд, пеш аз оғози иҷрои барнома.