ProgramlamaAndroid geliştirici

Kotlin'deki görünürlük alanları (visibility modifiers) nasıl çalışır: internal, private, protected, public? Farklı bağlamlarda (sınıflar, fonksiyonlar, özellikler, nesneler, üst düzey fonksiyonlar ve dosyalar) modifikatörler arasındaki farklar nelerdir?

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

Cevap

Kotlin'de aşağıdaki görünürlük modifikatörleri bulunmaktadır:

  • public (varsayılan): öğe her yerde görünür.
  • internal: öğe bir modül içinde görünür (jar/gradle modülü vb.).
  • protected: yalnızca sınıf içinde ve onun alt sınıflarında görünür.
  • private: yalnızca dosya veya sınıf içindeki görünür.

Özellikler:

  • Üst düzey fonksiyonlar, özellikler ve sınıflar için: private, erişimi dosya sınırlarıyla kısıtlar; internal modül ile, public/protected ise sınıf dışında anlamsızdır.
  • Sınıf üyeleri için: private yalnızca bu sınıf içinde, protected artı alt sınıflar, internal ve public yukarıda açıklandığı gibidir.
  • Nesneler/arkadaş nesneleri içinde: sınıf ile aynı şekilde.
class MyClass { private val secret = "hidden" protected val id = 42 internal fun foo() {} public fun bar() {} } internal fun moduleFunc() {} private fun fileOnlyFunc() {}

Çelişkili Soru

"Üst düzey bir fonksiyon protected olabilir mi? Evet ise, bu nasıl çalışır? Hayır ise, neden?"

Cevap: Hayır, üst düzey bir fonksiyon protected olamaz çünkü bu erişim düzeyine ait bir sınıf yoktur. Bunu derleyici kontrol eder – bir derleme hatası oluşacaktır.

protected fun magic() {} // Hata: protected modifikatörü, üst düzey fonksiyonlar için izin verilmez

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri


Hikaye

Fintech uygulamasında, internal modifikatörün modüldeki tüm öğelere erişim sağladığını unuttular. Sonuç olarak, bir yeniden yapılandırma sırasında bazı mantıkları başka bir gradle modülüne taşıdılar ve bu nedenle veri erişimi çalışmadı; ancak geliştiriciler bunu hemen fark etmediler çünkü eski testlerde derleme hatası yoktu.


Hikaye

Çok platformlu bir projede, gizli verileri companion object içinde private özellikler olarak tanımladılar. Bu verilerin serileştirildiği ve reflection ile erişilebilir hale geldiği ortaya çıktı çünkü val olarak tanımlandı ve dışa aktarımı kısıtlayan anotasyonlar kullanılmadı.


Hikaye

Mobil projenin başlangıcında, partner sınıfların erişimini kısıtlayacağını düşünerek üst düzey fonksiyonlar için private kullandılar. Ancak, utils dahilinde tek bir dosya içinde bu fonksiyonlar herkes tarafından görünür hale geldi; bu da bilgi sızıntısı tehdidine ve iş mantığında beklenmedik bir şekilde kullanılmalarına yol açtı.