ProgramlamaBackend Geliştirici

Kotlin'daki üst düzey fonksiyonlar ve özellikler için visibility modifiers (internal/private/protected/public) mekanizması nasıl çalışır? Java ile hangi farklar vardır ve dikkate alınması gereken hangi ipuçları vardır?

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

Cevap.

Kotlin'de visibility modifikatörleri, sınıflar, özellikler, fonksiyonlar ve üst düzey (dosya seviyesinde) varlıklar gibi bildirimlerin erişimlerini kontrol etmeyi sağlar. Java'dan farklı olarak, modifikatörler yalnızca sınıf düzeyinde geçerli iken, Kotlin'de üst düzey bildirimlerde de çalışır, bu da büyük projelerin ve kütüphane API'lerinin yapılandırılması için önemlidir.

Sorunun Tarihi

Java'da, sınıf dışında fonksiyonlar veya özellikler için visibility modifikatörleri bulunmamaktadır - her şey public (veya package-private) sınıfın içindedir. Kotlin'de, projeyi farklı bir şekilde yapılandırmak yaygındır; sıklıkla bir fonksiyon veya özellik sınıfın içinde değil, doğrudan dosyada bulunur.

Sorun

Java geliştiricileri genellikle public'in varsayılan olarak Java'daki gibi çalıştığını beklerler, ancak Kotlin'de üst düzey fonksiyon (veya özellik), aksi belirtilmediği sürece tüm modüllerde görülebilir. Yanlış bir visibility belirlemesi, kamu API'sinin sözdizimsel kirlenmesine, beklenmeyen iç yardımcı araçların erişilebilirliğine veya gerekli public fonksiyonların erişilemezliğine yol açabilir.

Çözüm

Kotlin'de aşağıdaki modifikatörler kullanılabilir:

  • public: bildirim her yerde görünür (üst düzey için varsayılan modifikatör).
  • internal: bildirim, aynı modülün tüm dosyalarında görünür (bir gradle modülü, bir derlenen arıza, bir jar içinde).
  • private: yalnızca bildirildiği dosyada/sınıfta görünür. Üst düzeyde - yalnızca dosya içinde.
  • protected: üst düzey bildirimler için geçerli değildir, yalnızca sınıflar/arayüzler ve bunların miras alanları için geçerlidir.

Örnek:

// dosya: Foo.kt private fun utilityFun() {} internal val bar: Int = 10 public val baz: Int = 20 // public gerekli değil fun printValue() { println(bar) }

Temel Özellikler:

  • internal, görünürlüğü modül ile (jar/arızalar) sınırlar, paket ile değil.
  • protected, üst düzey fonksiyonlar veya özellikler için kullanılamaz.
  • private, üst düzeyde mevcut dosyadaki bildirimi sınırlar.

Kandırıcı Sorular.

Üst düzey bir fonksiyon için protected kullanılabilir mi?

Hayır, protected yalnızca sınıf/arayüz üyeleri için geçerlidir, üst düzey bu tür öğeleri desteklemez.

Eğer üst düzey bir fonksiyonu internal olarak bildirirsem, diğer modüllerde görünür mü?

Hayır. Yalnızca mevcut jar/Gradle modülü içinde görünür.

private sınıf ile private üst düzey fonksiyon arasındaki fark nedir?

  • private sınıf: yalnızca mevcut dosya içinde görünür, dosya dışındaki kullanıma kapanıktır.
  • private üst düzey fonksiyon veya özellik: yalnızca dosya içinde görünür.

Örnek:

// dosya: Utils.kt private fun helper() { /* ... */ } // yalnızca bu dosyada görünür internal fun useful() { /* ... */ } // modülün tamamında görünür

Tipik Hatalar ve Anti-Desenler

  • Tüm bildirimler için varsayılan olarak public kullanılması, auto-complete ve API'nin "kirlenmesine" yol açar.
  • Harici müşteriler için tasarlanmış bir kütüphane için internal kullanmak, gereken public API'ları gizler.
  • protected ile karmaşa ve bunları üst düzeyde uygulama denemeleri.

Gerçek Hayat Örneği

Olumsuz Durum

Test yardımcıları public olarak bildirildiği için artefact'a dahil olurlar ve kütüphane istemcisine engel olurlar - public API ile ilgili olmayan her şey görünür hale gelir.

Artıları:

  • Hızlı entegrasyon.

Eksileri:

  • Public API'nin boyutu artar, "rastgele" yöntemler erişime açılır.

Olumlu Durum

İç fonksiyonlar private olarak, modül içinde ortak kullanım için internal görünürlüğe sahip yardımcılar, yalnızca dikkatlice düşünülmüş arayüzler public erişime sahiptir.

Artıları:

  • API'nin net, temiz yapısı.
  • Rastgele bağımlılıkların minimize edilmesi.

Eksileri:

  • Proje yapısını düşünme gerekliliği.