İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

Encapsulation

Encapsulation Kavramı

Her class çeşitli üyelerden (property ve method'lardan) oluşur. Hemen hemen bütün class'lar başka bir class tarafından kullanılmak amacıyla üretildiğinden, bazı üyeler sadece dışarıdan kullanılmak üzere hazırlanmıştır. Buna karşı bazı property ve method'lar, diğerlerine yardımcı olmak, sadece onlar tarafından class'ın iç işlerinde kullanılmak için yazılırlar. Belli bir class'ı kullanan class'ın bunları görmesi veya bilmesi gerekmez. Hatta bazı durumlarda property ve method'ların sadece ufak bir kısmı dışarısı tarafından kullanılır. Bir insanın belli bir class'a baktığında üyelerden hangisi kendisinin işine yarar, hangisi sadece başka methodlarda kullanılmak için yapılmıştır ve class'a özel'dir anlaması çok zor olabilir. Bazı durumlarda da güvenlik ve sağlamlık sağlamak amacıyla bir class'ı kullanan class'ın bazı property'leri değiştirmesi ve bazı methodlara erişmesi engellenmek istenebilir. Bazı property ve methodların ait olduğu class'ın dışında erişimini sınırlama özelliğine 'encapsulation' (kapsülleme) denir. Encapsulation sağlamak için private, public ve proteced sözcükleri kullanılır. Bunlara access modifier (erişim değiştirici) denir. Hiç birini kullanmak da bu bağlamda belli bir tercih anlamına gelir.

Default Access

Hiç bir access modifier kullanılazsa, yani bir property ve methodun başında private, protected ve public keyword'lerinden hiç biri kullanılmazsa bu üye 'package private' olur. Yani ona sadece aynı package'deki diğer class'lar erişebilir, diğer package'lerdekiler erişemez.

Public Access

Sistemdeki bütün class'ların erişebilmesini sağlamak için 'public' erişim değiştiricisi kullanılır. Herkesin erişmesinde sakınca bulunmayan üyeleri için kullanılır. Genellikle bu değiştirici özellikle başkaları erişsin diye yazılan property ve method'lar için kullanılır. Bir nesnede ne kadar az public değişken varsa dışarıya o kadar sade görünür ve o kadar kolay kullanılır. O nesneyi kullananlar gereksiz bir çok üye arasında dolaşmak zorunda kalmazlar.

Private Access

Bir property veya method'un sadece tanımlandığı class'dan erişilebilmesini, başka bir deyişle, o class dışındaki bütün class'lardan (aynı package'de olsalar bile) erişiminin yasaklanmasını sağlamak için 'private' keyword'ü kullanılır.

Bir değişkenin dışardan görülebilmesini ancak değiştirilemesini veya değiştirme işleminin class'ın kontrolünde yapılmasını sağlamak için standart bir yöntem izlenir. Bir property'yi read-only (salt okunur) yapmak için, o property private yapılır. Ona erişmek için bir tane public method yazılır. Bu şekilde dışarından property'nin value'si dolaylı olarak öğrenilmiş olur.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class MyDiscreetClass{
  2   private int value=3;
  3   public int getValue(){
  4     return value;  
  5   }
  6 }

Bu class'tan yaratılmış bir nesne'yi kullanan örnek yapalım.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class MyDiscreteUserClass{
  2   public static void main(){
  3     MyDiscreetClass d=new MyDiscreetClass();
  4     int v=d.getValue();
  5     System.out.println("Value : "+v);
  6   }
  7 }

Buradaki value private olduğu için

	int v=d.value;

yazarsak derleyici hata verir. Property orada olduğu halde artık erişilmez hale gelmiştir. Ama değeri öğrenmek için getValue() methodu kullanılabildiği için bir programın işleyişini bozmaz. Biz bu değeri değiştirmek istersek :

	d.value=5;

derleyici yine hata verecektir. Bu şekilde class kendi property'sini korumuş oluyor.

Bir değişkenin hem okunması hem de değiştirilmesi istenip sadece bunun kontrollü bir şekilde yapılmasını istersek yine property'yi private tutarız ve hem erişebilmek için hem de değiştirebilmek için iki ayrı method yazarız. Bir değerin eksi olmamasını sağlayan bir class yapalım :

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class MyControlledClass{
  2   private int value=3;
  3   public int getValue(){
  4     return value;  
  5   }
  6   public void setValue(int v){
  7     if(v>0){
  8       value=v;
  9     }else{
 10       value=-v;
 11     }
 12   }
 13 }

Bu değeri değiştirip sonrsa yeni değeri alan bir program yazalım.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class MyControlledUserClass{
  2   public static void main(){
  3     MyControlledClass d=new MyControlledClass();
  4     d.setValue(-7);
  5     int v=d.getValue();
  6     System.out.println("Value : "+v);
  7   }
  8 }

Bu program, kendisinin değiştirmeye (kullanılan class açısından bakarsak, 'bozmaya') çalıştığı değerin hala sağlam olduğunu ortaya koymaktadır.

Protected Access

Bazı durumlarda bir property veya method'un dışarıya kapalı olmasını ancak o class'ı extend edenlere açık olması istenebilir. Bu durumda 'protected' erişim değiştiricisi kullanılır. Bir class diğerini extend ederse, onun bütün public property'lerin erişebilir hale gelir. Zaten bunlara her class'ın erişebilmektedir. Hiç bir private property extend eden class'a geçmez. Bunlar diğer bütün class'lara da kapalıdır. Ancak protected property ve methodlar dışarıya kapalı oldukları halde, extend edilen class bunlara erişim hakkına sahiptir. Bu keyword, belli bir property veya method'un sadece onu extend eden class'ları ilgilendirmesi durumunda kullanılır.

Erişim değiştirici olarak protected verilmiş property veya method'lara o class'la aynı package içerisindeki bütün class'lar tarafından da erişilebilir.

Erişim Düzeyleri Sıralaması

Encapsulation düzeyleri için

	public > protected > 'default' > private

şeklinde bir sıralama yapılır. Büyük olan düzey küçük olanların haklarını da kapsar. Bir property'nin public olup private özelliği içermemesi, yani tanımlandığı class'tan erişilemez ama onun dışındaki bütün class'lardan erişilmesi gibi bir durum söz konusu olamaz.

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır