ProgramlamaKotlin geliştirici, Junior/Mid Backend

Kotlin'de type inference (tip çıkarımı) nedir? Açık tip belirtimi gerektiğinde mekanizma nasıl çalışır ve hangi kısıtlamalar vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Tarihçe: Kotlin, özlü ama katı bir tipli sözdizimine sahip bir dil olarak tasarlandı. Okunabilirliği artırmak ve kod tekrarını azaltmak için güçlü bir type inference (tip çıkarımı) sağlandı.

Sorun: Bazen tip belirtimi gereksiz hale gelir, bu da kodu karmaşıklaştırır. Ancak aşırı tip kısaltmaları, okuyucular için zorluklar yaratır ve derleyici tip çıkarımında başarısız olursa hatalara yol açar.

Çözüm: Type inference, derleyicinin çoğu tipi otomatik olarak inicializasyon veya bağlama dayalı olarak belirlemesini sağlar. Ancak katı tip kontrolü, yine de kodun doğruluğunu denetler.

Kod örneği:

val name = "Kotlin" // String, tip otomatik olarak çıkarıldı var count = 5 // Int, tip otomatik olarak çıkarıldı val items = listOf(1, 2, 3) // List<Int> // Tip belirtimi gereklidir, eğer çıkarım mümkün değilse val callback: (Int) -> Unit = { println(it) }

Ana özellikler:

  • Değişkenin veya ifadenin tipi, inicializasyondan veya fonksiyon çağrısının bağlamından çıkarılabilir
  • Tipin çıkarılması her zaman mümkün değildir: derleyici, ifade belirsiz olduğunda açık bir beyan gerektirir
  • Type inference, kamu fonksiyonlarının ve özelliklerin dönüş tiplerine uygulanmaz: derleyici, ABI istikrarı için bunların açıkça belirtilmesini gerektirir.

Şüpheli Sorular.

Kamu bir fonksiyonun dönüş tipini belirtmek mümkün mü?

Hayır, eğer fonksiyon kamu ise, derleyici, arayüzlerin istikrarı ve Java interoperabilitesi desteği için dönüş tipinin açıkça belirtilmesini isteyecektir.

Örnek:

// Hata! public fun compute(x: Int) = x * 2 // Açıkça gerektirir: public fun compute(x: Int): Int = x * 2

val x = null ifadesinin tipi nedir?

Derleyici tip çıkarımında başarısız olacaktır, çünkü null, bağlam olmadan tamsayıya sahip değildir. Tip açıkça beyan edilmelidir:

val x: String? = null

Tip çıkarımı karmaşık generic tipler için zincirleme koleksiyon işleme durumunda çalışabilir mi?

Evet, ancak tip belirsizse (örneğin, map tipleri dönüştürüyorsa), bazen değişken tipini açıkça belirtmek gerekir:

val values = listOf("1", "2").map { it.toInt() } // List<Int>, tip çıkarılacak

Tipik hatalar ve anti-patternler

  • Kamu API fonksiyonlarında açık tip yokluğu
  • Okunabilirliği zorlaştıran belirsiz tiplerle aşırı yüklenmiş kod
  • Null ile inicializasyon işlemi sırasında tip çıkarımı hataları

Gerçek hayat örneği

Negatif durum

Projede tüm değişkenler tip belirtilmeden tanımlanır, bu diğer geliştiriciler veya yeni çalışanlar için kodu anlamayı ve gezinmeyi zorlaştırır.

Artılar:

  • Daha az kod
  • Daha hızlı yazma ve yeniden düzenleme

Eksiler:

  • Okunması ve bakımı zor
  • Inicializasyon değiştirildiğinde kolayca hata yapma ihtimali

Pozitif durum

Fonksiyonlar içinde değişkenlerin tipleri otomatik olarak çıkarılır, ancak tüm kamu API'lerinde her zaman dönüş tipi ve parametre tipleri açıkça belirtilir.

Artılar:

  • Kodda gezinmek kolay
  • Kamu metodlarının net biçimlendirilmiş sözleşmeleri

Eksiler:

  • Bazen, karmaşık generic tipler için biraz daha fazla kod gerekir.