Class’larda neden Get ve Set ifadeleri kullanılıyor?


Get ve Set muhabbetini öğrenip unutma sürecini hep yaşıyorum. En son bunu da kaydetme kararı aldım. Anlatımı Java üzerinden yapacağım fakat class yapılarında get – set mantığı hep aynı olduğundan diğer diller için de kullanılabilir bir bilgidir. Konuya geçiyorum.

ilac_kapsul

İlk önce public değişkenlerle başlayalım.
/* Class Dosyası */
public class Insan {
    public int yas;
    public String isim;
}

/* main Metodununun Bulunduğu Dosya */
import SiniflaraGiris.Insan;

public class SifirdanJava {

    public static void main(String[] args) {
        Insan i1 = new Insan();
        i1.isim = "Ali Veli";
        i1.yas = 10;
        
        System.out.println(i1.isim + "  --  " + i1.yas);
    }
}

Görüldüğü üzere sadece değişkenlerden oluşan bir sınıfımız ve sınıf içeriğini çağırıp çalıştırdığımız dosyamız var. Biz yazdığımız kodlarda değişkenleri doğrudan kullanmışız ve yine bu değişkenleri doğrudan kullanarak yazdırmışız.

Eee, ne olmuş?
Sınıf değişkenlerine doğrudan ulaşmak… İşte sıkıntı çıkarabilecek nokta burası.

Değişkenlere doğrudan müdahale etmek ne gibi sonuçlara vesile olabilir?
  • Son kullanıcı hatalı, istenmeyen veri girişi yapabilir.
  • Yine son kullanıcı yaptığı müdahalelerle güvenlik sıkıntıları oluşturabilir.
  • Yukarıdaki class’ta public erişiminde bir değişken kullandık, bu dışarıdan her türlü iyi ve kötü niyetli müdahalelere açık.
  • Belki başka bir class’ta da aynı değişken adı kullanılacak, değişken değerleri karışabilir.

Aklıma gelen bir kaç tanesini yazdım, seçenekler daha da çoğaltılabilir.

– Öyle ipini koparan değerin gelmemesi lazım.
– Değişkenleri de herkes göremesin. Bu nedir arkadaş?
– Peki ne yapalım?
– Öncelikle şu class değişkenlerini bir private yapalım, değil mi?
– İyi, güzel, hoş da o zaman değişkenlere doğrudan erişemeyiz ve main metodunun olduğu dosyada kullanamayız.
– Haah! İşte get ve set kullanacağımız yere geldik. Çağırın gelsinler!

private erişimli değişkenlerle devam ediyoruz.
/* Class Dosyası */
package SiniflaraGiris;

public class Insan {
    private int yas;
    private String isim;

    public int getYas() {
        return yas;
    }

    public void setYas(int yas) {
        this.yas = yas;
    }

    public String getIsim() {
        return isim;
    }

    public void setIsim(String isim) {
        this.isim = isim;
    }
}

/* main Metodunun Bulunduğu Dosya */
import SiniflaraGiris.Insan;

public class SifirdanJava {

    public static void main(String[] args) {
        Insan i1 = new Insan();
        i1.setIsim("Ali Veli");
        i1.setYas(10);
        
        System.out.println(i1.getIsim() + "  --  " + i1.getYas());
    }
}

Aga, bu nedir?
Şimdi işin mantığını görsel olarak anlatmaya çalışacağım.
java_get_set_mantigi

Resimden de görülebileceği gibi değişkene veri alma ve gönderme sürecinde 3 adet bilinmesi gereken nokta var. Açıklayayım.
Değişkenleri private olarak tanıttık, get – set ayarlarını yaptık ve şimdi artık verileri bu şekilde alabileceğiz. yas değişkeni için değişkene veri aktarma ve değişkendeki veriyi çağırma işi nasıl oluyor görelim.

  1. private erişimli değişkene metotla veri gönderelim.
    Sınıfımızın bir örneğini oluşturduk ve bu örnek üzerinden setYas() metodu ile yaş bilgisini girdik.
  2. Verinin gönderilme süreci nasıl oluyor?
    Nedir bu setYas() metodu? Parametre olarak bir int değeri alıyor ve this ifadesi yardımıyla ilgili class’taki değişkene aktarıyor. Biz bu şekilde değişkeni bir metotla giydirmiş olduk. Daha bilinen tabirle kapsülledik (encapsulation).
  3. Veriyi çağıracağım, ne yapmalıyım?
    Üçüncü aşamamız da class değişkenindeki değeri çağırmak istediğimizde işe yarıyor. Biz değeri almak istiyoruz, gönderirken metotla hallettik ama alırken yine erişim sıkıntısıyla karşılaşacağız. Bunun için de get metodu ile sınıf içindeki değişkeni döndürüyoruz. getYas() metodu da özetle bu işe yarıyor.

Hala anlayabilmiş değilim. Değişkenlere yine müdahale edebiliyoruz işte!
Hemen yaptığımız işlerin ne gibi farklılıklar oluşturduğunu görelim.

  1. Öncelikli olarak amacımız değişkeni ulaşılmaz kılmak değil, kontrolsüz bir müdahalenin önüne geçmek.
  2. İkincisi, ben en klasik örneği kullandım. get ve set metotları tek satırlık kodlardan oluşuyor ve bu kodlar da bir şeye müdahale ediyor gibi görünmüyor. Bu metotlara uygun şekilde daha güvenli kılabilecek kodlamalar yazılabilir ve daha etkin bir kontrol sağlanabilir. Örneğin yaş bilgisinin 500 olarak girilmemesini sağlayan bir kodlama yapılabilir.
  3. Bir diğer fark, biz ilk kodda değişkeni doğrudan çağırabiliyorduk, çünkü public erişime sahipti. Bu ise private erişime sahip. private erişimli değişkeni dışarıdan çağıramayız ki, izin vermez. Keşke ulaşabileceğimiz bir yol olsaydı. Bir dakika, get-set var ya! get ve set metotları bizim class değişkenlerine ulaşabilmemizi ve müdahale edebilmemizi sağladı.
  4. Bir üst maddede class ulaşımına ve müdahalesine metotların aracılık ettiğinden bahsetmiştim. İşte kapsüllemenin en güzel taraflarından birisi de bu: Gönderilen ve alınan bilgiler metotların gerektirdiği gibi ve izin verdiği kadar oluyor. Yukarıdaki maddelerin özeti kısaca bu şekildedir diyebiliriz.

Böyle işte.


Bunlar da hoşunuza gidebilir...


4 Cevaplar

  1. DoublZro dedi ki:

    Gerçekten helal olsun. Bende diyordum ki: “Ne olmuş yani öylece class değişkenlerini public olarak kullanırsak? Ne farkı var?”. Anlatımınız süperdi. Teşekkürler!

    • eMB dedi ki:

      Güzel yorumunuz için teşekkür ederim. 🙂 Bize hep basit örnekler üzerinden anlatım yapıldığından dolayı önemi pek yokmuş gibi algılanıyor ve get – set kullanımı da külfetmiş gibi geliyor. Ama işinin ehli dayılar, ablalar, yeğenler filan hep düşünmüşler. 🙂

  2. Kübra dedi ki:

    Anlatımınız çok güzel Get-set olayını anlayabildim sonunda teşekkürler

    • eMB dedi ki:

      Yorumunuz için teşekkür ediyorum Kübra Hanım, faydalı olmasına sevindim. İyi çalışmalar diliyorum. 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir