Paketler(packages), sınıflar(classes) veya nesneler(objects) erişim belirleyicileri tarafından Private, Protected veya bunlardan birini kullanmadığımızda varsayılan olarak Public olarak belirlenir. Bu belirleyiciler kodun belirli kısımlarına erişimi kısıtlar. Erişim belirleyicilerini kullanmak için alt bölümde göreceğimiz gibi anahtar kelimeleri paketin, sınıfın veya nesnenin üyelerini tanımlarken belirtiriz.
Bir özel(private) üye sadece tanımlanmış olduğu sınıf veya nesneye görünür. Aşağıdaki örnekte görüldüğü gibi:
class Outer {
class Inner {
private def f() { println("f") }
class InnerMost {
f() // Burada sorun yok
}
}
(new Inner).f() // Hata: f buradan erişilemez.
}
Scala’da dilinde üstteki gibi (new Inner).f() kullanımı illegaldir çünkü f ‘Private’ anahtar kelimesi yani ‘özel’ olarak ‘Inner’ sınıfı içerisinde tanımlanmıştır ama ‘Inner’ dışından erişilmeye çalışılmıştır. Aksi olarak ‘InnerMost’ sınıfı ‘Inner’ sınıfının üyesi olduğu için ‘InnerMost’ sınıfı içerisinden f fonksiyonuna hatasız bir şekilde erişebildik. Java her iki kullanıma da izin verebilir.
Korumalı üyelere sadece tanımlamanın yapıldığı sınıfın alt sınıfından erişilebilir. Aşağıdaki örnekte görüldüğü gibi:
package p {
class Super {
protected def f() { println("f") }
}
class Sub extends Super {
f()
}
class Other {
(new Super).f() // Hata: f buradan erisilemez.
}
}
f fonksiyonuna ‘Sub’ sınıfından erişimde bir problem yok çünkü, f ‘Super’ sınıfının içinde Protected ile tanımlanmış ve ‘Sub’ sınıfı ‘Super’ sınıfının alt sınıfıdır. ‘Other’ sınıfından f fonksiyonuna erişime izin verilmedi çünkü ‘Other’ sınıfı ‘Super’ sınıfından miras alınmamıştır. Java’da her iki kullanıma da izin verilebilir çünkü, ‘Other’ ve ‘Sub’ aynı paket(package) içerisindedir.
Private veya Protected anahtar kelimesi ile tanımlanmayan her üye Public(ortak) olarak kabul edilir. Public üyeler için belli bir anahtar kelime yoktur. Bu tür üyelere herhangi bir yerden erişilebilir. Aşağıdaki örnekte görüldüğü gibi:
class Outer {
class Inner {
def f() { println("f") }
class InnerMost {
f() // OK
}
}
(new Inner).f() // OK because now f() is public
}
Erişim belirleyicileri niteleyiciler ile arttırılabilir. Bu niteleyiciler private[X] veya protected[X] olmakla beraber erişimin paket kapsamı içerisinde belirtilen X’e kadar Private veya Protected olduğunu belirtir. X paket(package), sınıf(class) veya tek bir nesne(object) olabilir. Aşağıdaki örnek üzerinde biraz düşünün:
package society {
package professional {
class Executive {
private[professional] var workDetails = null
private[society] var friends = null
private[this] var secrets = null
def help(another : Executive) {
println(another.workDetails)
println(another.secrets) // Hata
}
}
}
}
Yukarıdaki örnekte aşağıdaki noktalara dikkat edilmelidir: