Erişim belirleyiciler gerçekten çok önemli bir konudur.
Sınıflar, Objeler, Constructorlar, Fonksiyonlar, Interfaceler, properties ve onların Setterları erişim belirleyicileri alabilirler.
Getter’lar ise her zaman properties ile aynı erişim belirleyiciye sahiptirler.
Kotlin içerisinde 4 farklı erişim belirleyici vardır: private, protected, internal ve public. Herhangi bir erişim belirleyici verilmemiş ise varsayılan olarak public olur.
Paketlerde Erişim Belirleyiciler
Fonksiyonlar, properties, sınıflar, objeler ve interfaceler “top-level” olarak paketlerin içinde doğrudan tanımlanabilir.
// dosya adı: example.kt
package foo
fun baz() { ... }
class Bar { ... }
Eğer herhangi bir erişim belirleyici belirtmezseniz varsayılan olarak public kabul edilir. Yani tanımladığınız şey her yerden erişilebilir.
Eğer tanımladığınız şeyler için private kullanırsanız, sadece tanımladığınız dosya içerisinde erişilebilir.
Tanımlamanızı internal olarak yaparsanız aynı modüldeki her yerden erişilebilir.
protected erişim belirleyici “top-level” tanımlamalarda kullanılamaz!
Başka bir paketten görünür bir “top-level” kullanmak için, yine de import yapmanız gerekir.
Örnek:
// dosya adı: example.kt
package foo
private fun foo() { ... } // example.kt dosyasının içinde erişilebilir
public var bar: Int = 5 // property her yerden erişilebilir public tanımlandığı için
private set // setter sadece example.kt dosyasının içinde erişilebilir
internal val baz = 6 // example.kt dosyası ile aynı modülde yer alan yerlerden erişilebilir.
Sınıflar ve Interface’lerde Erişim Belirleyiciler
Sınıfın içinde tanımlanmış üyeler için:
private sadece tanımlandığı sınıf içinde erişilebilir (tanımlandığı sınıfın bütün üyelerini kapsar)
protected belirleyici private ile aynı erişimi verir ama alt sınıflarda da erişilebilir
internal aynı modülden erişilebilir
public her yerden erişilebilir
Kotlinde dış sınıf inner sınıfların içindeki private üyelere erişemez
Eğer protected bir üyeyi override ediyorsanız ve erişim belirleyiciyi değiştirmiyorsanız override ettiğiniz üyelerde protected durumdadır.
Örnek
open class Outer {
private val a = 1
protected open val b = 2
internal val c = 3
val d = 4 // erişim belirleyici default olarak public
protected class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
// a değişkenine erişilemez
// b, c ve d erişilebilir
// Nested ve e erişilebilir
override val b = 5 // 'b' protected
}
class Unrelated(o: Outer) {
// o.a, o.b erişilemez
// o.c ve o.d erişilebilir (aynı modül içinde olduları için)
// Outer.Nested erişilemez, ve Nested::e her ikisi içinde erişilemez
}
Constructorlar’da Erişim Belirleyiciler
Constructor için constructor anahtar sözcüğünü eklemeniz gerekmektedir.
class C private constructor(a: Int) { ... }
Yukarıdaki örnekte constructor private tanımlanmıştır, normalde constructorlar varsayılan olarak public kabul edilir. Sınıfın erişilebildiği her yerde erişilebilir. (eğer sınıf internal ise sadece aynı modülde erişilebilir)
Yerel Tanımlamalar
Yerel değişkenler, fonksiyonlar ve sınıflar erişim belirleyici alamazlar.
Modüller
Internal erişim belirleyici, üyenin aynı modül içinde görünür olduğu anlamına gelir. Daha spesifik olarak, bir modül, birlikte derlenen bir Kotlin dosyaları kümesidir:
IntelliJ IDEA module
Maven project
Gradle kaynak kümesi(bir istisna olarak test maindeki internal tanımlamalara erişebilir )
<kotlinc>
Kaynağa başlığa tıklayarak ulaşabilirsiniz. Var ise hatalar için veya katkı sağlamak için mail atabilirsiniz. umutcansahin@disketcanavari.com