Contracts
- Kotlin kursu
- Uzman
- Ders 1/47
- 5 dk
Kotlin contracts ile derleme zamanı güvencesi öğrenirsin.
Sözleşmeler (contracts)
Contracts, bir fonksiyonun çağrıldıktan sonra hangi koşulların geçerli olacağını derleyiciye bildiren taahhütlerdir. Kotlin'in kotlin.contracts API'si ile yazılır; deneysel bir API'dir.
En yaygın kullanım: bir fonksiyon döndüğünde bir değerin null olmadığını şöylemek. Örnek: contract { returns() implies (x != null) }. Böylece çağıran yerde ek bir !! ya da if (x != null) bloğu gerekmez. Contracts yalnızca derleyiciye bilgi verir; çalışma zamanında ek kod üretmez.
returns() implies
Bir sözleşme bloğu contract { ... } ile açılır. En sık kullanılan madde returns() implies (koşul) şeklindedir.
Örnek: contract { returns() implies (x != null) }. Bu sözleşme şunu söyler: bu fonksiyon normal döndüğünde x null değildir. Böylece requireNonNull(name) çağrısından sonra derleyici name'i String türünde kabul eder. Sözleşme yanlışsa çalışma zamanında hata alınır; bu yüzden sözleşme yazarken dikkatli olun.
Uygulama requireNonNull fonksiyonunu yaz
requireNonNull(x: String?): String fonksiyonunu tanımla. İçinde contract { returns() implies (x != null) } sözleşmesi olsun. main içinde requireNonNull(name) çağrısından sonra println(name.length) yaz.
Başlangıç kodu
import kotlin.contracts.*
fun requireNonNull(x: String?): String {
// sözleşmeyi ekle
return x!!
}
fun main() {
val name: String? = "Ayşe"
requireNonNull(name)
// uzunluğu yazdır
}Örnek çözüm
fun requireNonNull(x: String?): String {
contract { returns() implies (x != null) }
return x!!
}
fun main() {
val name: String? = "Ayşe"
requireNonNull(name)
println(name.length)
}Beklenen çıktı
4
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir contract ne işe yarar?
- Çalışma zamanında hata fırlatır
- Async çağrıyı bekletir
- Yeni bir sınıf üretir
- Derleyiciye davranış taahhüdü verir Doğru cevap
Açıklama: Contract derleyiciye bilgi verir; çalışma zamanında kod üretmez.
2 Sözleşme bloğunu tamamla
fun requireNonNull(x: String?): String {
____ { returns() implies (x != null) }
return x!!
}
fun requireNonNull(x: String?): String {
contract { returns() implies (x != null) }
return x!!
}
Açıklama: contract { } bloğu sözleşme başlatır.
3 Sözleşme parçalarını eşle
| Kavram | Anlamı |
|---|---|
contract |
Sözleşme bloğu |
returns() |
Dönüş koşulu |
implies |
Sonucu bildirir |
x != null |
Null olmama güvencesi |