Ders 6 - Scala Erişim Belirleyicileri(Access Modifiers)

8 Haz 2016 · 3 dk okuma süresi

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.

Özel Üyeler (Private members):

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ı Üyeler (Protected members):

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.

Ortak Üyeler (Public members):

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
}

Koruma Kapsamı (Scope of protection):

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:

  • workDetails değişkenine professional paketi içerisindeki herhangi bir sınıf için erişilebilir durumdadır.
  • frineds değişkeni society paketi içerisindeki herhangi bir sınıf için erişilebilir durumdadır.
  • secrets değişkeni sadece belirtilen yerin içinden erişilebilir durumdadır (this).