İçeriğe geç

Menü

Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Java’da Kapsülleme Nedir? private, getter ve setter Nasıl Kullanılır?

java-kapsulleme-private-getter-setter-nasil-kullanilir
Bu yazıda neler var?
  1. Java’da kapsülleme nedir ve neyi kontrol eder?
  2. private, public ve constructor ilişkisi nasıl çalışır?
  3. Getter ve setter nasıl kullanılır?
  4. BankAccount ile geçerli bakiye nasıl korunur?
  5. Setter yerine getter veya davranış metodu ne zaman seçilir?
  6. Sık Sorulan Sorular

Java’da kapsülleme, nesnenin iç durumuna doğrudan erişimi sınırlandırıp okumayı ve değişiklikleri sınıfın belirlediği erişim noktalarından geçirme yaklaşımıdır. private alanlar dışarıya kapatılır, public getter ve setter metotları gerektiğinde kontrollü okuma ve güncelleme sağlar. Ancak her alana otomatik getter ve setter eklemek tek başına kapsülleme değildir; önemli olan, değişikliklerin geçerli kuralları korumasıdır.

“java kapsülleme private getter setter” ifadesiyle aranan temel ayrım budur: Alanı saklamak, o alana hangi işlemlerin hangi koşullarda uygulanacağını tasarlamakla birlikte anlam kazanır. Getter yalnızca okumayı, setter ise değiştirmeyi açabilir; fakat setter hiçbir doğrulama yapmıyorsa kapsülleme amacını zayıflatabilir.

Java’da kapsülleme nedir ve neyi kontrol eder?

Kapsülleme, bir nesnenin verisini ve bu veriyi değiştiren kuralları aynı tasarım içinde tutar. Örneğin banka hesabındaki bakiye yalnızca bir sayı değildir. Bakiyenin geçerli bir başlangıç değerine sahip olması, para yatırma işleminin uygun bir miktarla yapılması ve hesabın dışarıdan rastgele değiştirilememesi de hesabın kurallarıdır.

Alanı private yapmak bu korumanın başlangıç noktasıdır, sonucu değildir. Bir alan private olsa bile dışarıya koşulsuz bir setter açılırsa her değer kabul edilebilir. Bu nedenle kapsülleme, alanları gizlemekten çok, dışarıya hangi işlemlerin sunulacağını ve bu işlemlerin hangi kontrollerden geçeceğini belirlemektir.

Dışarıdaki kod nesnenin nasıl çalıştığını değiştirmek yerine, sınıfın sunduğu anlamlı işlemleri çağırır. Sınıf ise kendi iç durumunu korur. Örneğin dış kodun doğrudan balance = -50 ataması yapabilmesi yerine, deposit gibi bir metot çağrılır ve sınıf yatırılacak miktarı denetler. Böylece dışarıya görünen işlemler ile içeride korunan durum birbirinden ayrılır.

private, public ve constructor ilişkisi nasıl çalışır?

private, public ve constructor ilişkisi nasıl çalışır?

private bir alana sınıf dışından doğrudan erişilemez. Buna karşılık public metotlar, dışarıya açılan kontrollü erişim noktalarıdır. Bu metotlar yalnızca veriyi döndürmek veya değiştirmek zorunda değildir; gelen değeri doğrulayabilir, işlemi reddedebilir ya da nesnenin durumunu değiştirmeden önce ek kurallar uygulayabilir.

constructor ise nesne oluşturulurken çalışır. Başlangıç değerlerini kurar ve nesnenin kullanıma açıldığı anda geçerli bir durumda olmasına yardımcı olur. Aşağıdaki örnekte kötü tasarımda bakiye public olduğu için doğrudan değiştirilebilir. Kapsüllenmiş sınıfta ise bakiye private tutulur, başlangıç constructor ile kurulur ve geçersiz yatırma işlemi reddedilir.

public class ComparisonDemo {
    static class BadAccount {
        public int balance;
    }

    public static class GoodAccount {
        private int balance;

        public GoodAccount(int initialBalance) {
            if (initialBalance >= 0) {
                balance = initialBalance;
            } else {
                balance = 0;
            }
        }

        public boolean deposit(int amount) {
            if (amount <= 0) {
                return false;
            }

            balance += amount;
            return true;
        }

        public int getBalance() {
            return balance;
        }
    }

    public static void main(String[] args) {
        BadAccount bad = new BadAccount();
        bad.balance = -50;

        GoodAccount good = new GoodAccount(0);
        boolean accepted = good.deposit(-50);

        System.out.println("Kötü tasarım bakiyesi: " + bad.balance);
        System.out.println("Kapsüllenmiş bakiye: " + good.getBalance());
        System.out.println("Geçersiz işlem kabul edildi mi? " + accepted);
    }
}

Beklenen çıktı:

Kötü tasarım bakiyesi: -50
Kapsüllenmiş bakiye: 0
Geçersiz işlem kabul edildi mi? false

BadAccount sınıfında balance public olduğu için main metodu bu alana doğrudan -50 yazabilir. GoodAccount sınıfında ise balance private olduğu için sınıf dışındaki good.balance = -50; ifadesi derlenmez. Başlangıç değeri constructor üzerinden kurulur. deposit metodu negatif veya sıfır bir miktar gördüğünde false döndürür ve bakiyeyi değiştirmez. getBalance ise değeri değiştirmeden yalnızca okumaya yarar.

Bu erişim kararlarını uygulamalarla pekiştirmek için Java Özel Ders programı hakkında bilgi alabilirsin.

Getter ve setter nasıl kullanılır?

Getter ve setter nasıl kullanılır?

Getter, bir alanın değerini okumak; setter ise alana yeni bir değer atamak için kullanılır. Bu metotlar, private alanlara doğrudan erişim yerine sınıfın sunduğu public metotlarla kontrollü erişim sağlar.

class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

getName() metodu name alanının mevcut değerini döndürür. setName(String name) ise dışarıdan gelen değeri alana aktarır. Buradaki this.name nesnenin alanını, name ise metoda gönderilen parametreyi belirtir.

Ancak her private alan için otomatik getter ve setter oluşturmak, tek başına kapsülleme anlamına gelmez. Böyle bir yaklaşım, alanı doğrudan görünür yapmasa da her türlü değişikliğe açık hâle getirebilir. Setter içinde boş değer, sayı aralığı veya biçim kontrolü yaparak geçersiz atamaları reddedebilirsin.

Bazı alanlarda dışarıdan atama hiç sunulmaz. Alan yalnızca getter ile okunabilir veya sınıfın kendi metotları tarafından değiştirilebilir. Özellikle iş kuralı taşıyan değerlerde basit bir setBalance metodu yerine deposit ve withdraw gibi davranış metotları daha açıklayıcıdır. Bu metotlar yalnızca yeni bir değer atamaz, işlemin geçerli olup olmadığını da denetler.

BankAccount ile geçerli bakiye nasıl korunur?

Aşağıdaki tek dosyalık örnekte balance alanı dışarıya kapalıdır. Constructor negatif başlangıç bakiyesini reddeder. deposit ve withdraw metotları işlem kurallarını denetler. Dışarıya yalnızca bakiyeyi okumak için getBalance() sunulur, doğrudan bakiye değiştiren bir setBalance() metodu bulunmaz.

public class BankAccountDemo {
    public static void main(String[] args) {
        BankAccount account;

        try {
            account = new BankAccount(100);
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
            return;
        }

        try {
            account.deposit(50);
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }

        try {
            account.withdraw(30);
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }

        System.out.println("Bakiye: " + account.getBalance());

        try {
            account.deposit(-10);
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }

        try {
            account.withdraw(200);
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }

        try {
            new BankAccount(-1);
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }
    }
}

class BankAccount {
    private int balance;

    public BankAccount(int initialBalance) {
        if (initialBalance < 0) {
            throw new IllegalArgumentException(
                "Başlangıç bakiyesi negatif olamaz.");
        }
        balance = initialBalance;
    }

    public void deposit(int amount) {
        if (amount <= 0) {
            throw new IllegalArgumentException(
                "Yatırılacak tutar pozitif olmalı.");
        }
        balance += amount;
    }

    public void withdraw(int amount) {
        if (amount <= 0) {
            throw new IllegalArgumentException(
                "Çekilecek tutar pozitif olmalı.");
        }
        if (amount > balance) {
            throw new IllegalArgumentException("Yetersiz bakiye.");
        }
        balance -= amount;
    }

    public int getBalance() {
        return balance;
    }
}

Beklenen çıktı şöyledir:

Bakiye: 120
Yatırılacak tutar pozitif olmalı.
Yetersiz bakiye.
Başlangıç bakiyesi negatif olamaz.

Constructor doğrulaması, nesnenin oluşturulduğu anda geçerli bir başlangıç durumuna sahip olmasını sağlar. İşlem doğrulamaları ise sonradan yapılan değişikliklerde aynı geçerliliği korur. Böylece dışarıdaki kod balance alanını doğrudan değiştiremez; para yatırma ve çekme işlemleri sınıfın belirlediği kurallar üzerinden gerçekleşir.

Bu tür sınıf tasarımı ve metot sorumluluğu çalışmalarını birebir ilerletmek istersen Java özel ders programı sayfasındaki kapsamı inceleyebilirsin.

Setter yerine getter veya davranış metodu ne zaman seçilir?

Her private alan için otomatik olarak setter yazmak gerekmez. Getter okuma ihtiyacını, setter doğrudan atamayı, davranış metodu ise kurallı ve anlamlı bir işlemi temsil eder. Seçim, alanın kim tarafından ve hangi koşullarda değiştirilebildiğine göre yapılır.

  1. Alan kim tarafından değiştirilebilir? Alanı yalnızca sınıfın kendi metotları değiştirecekse onu private bırak ve doğrudan setter açma. Dışarıdan yalnızca okunması gerekiyorsa public getter ekleyebilirsin. BankAccount içinde balance bu nedenle dışarıdan doğrudan atanmaz.
  2. Hangi değerler geçerli? Hesap oluşturulurken başlangıç bakiyesi negatif olmamalı, constructor bu durumu denetlemelidir. Sonraki işlemlerde yatırma tutarı pozitif olmalı, çekme tutarı ise pozitif ve mevcut bakiyeyi aşmamalıdır.
  3. Değişiklik hangi kuralla yapılmalı? Değişiklik bir iş kuralı taşıyorsa setter yerine davranış metodu kullanılır. Sınırsız bir setBalance(), çağıranın bakiyeyi keyfî biçimde değiştirmesine ve geçerli durumu baypas etmesine yol açabilir. deposit() ve withdraw() ise değişikliği anlamlı bir işlemle sınırlar.
class BankAccount {
    private int balance;

    public BankAccount(int openingBalance) {
        if (openingBalance < 0) {
            throw new IllegalArgumentException("Bakiye negatif olamaz.");
        }
        balance = openingBalance;
    }

    public int getBalance() {
        return balance;
    }

    public void deposit(int amount) {
        if (amount <= 0) {
            throw new IllegalArgumentException("Tutar pozitif olmalı.");
        }
        balance += amount;
    }

    public boolean withdraw(int amount) {
        if (amount <= 0 || amount > balance) {
            return false;
        }
        balance -= amount;
        return true;
    }
}

public class Main {
    public static void main(String[] args) {
        BankAccount account = new BankAccount(100);
        account.deposit(50);
        System.out.println(account.withdraw(200));
        System.out.println(account.getBalance());
    }
}

Beklenen çıktı şöyledir:

false
150

withdraw(200) işlemi mevcut bakiyeyi aştığı için reddedilir ve bakiye 150 olarak kalır.

  1. Değer oluşturulurken belirlenip sonradan yeniden atanmayacak mı? Bu durumda private final alan, constructor ve yalnızca getter yaklaşımı uygundur. Ancak yalnızca getter bulunması nesneyi her açıdan otomatik olarak değişmez yapmaz. Sınıfın başka metotları iç durumu değiştirebilir veya getter, değiştirilebilir bir nesne referansı döndürebilir.

Bu kararları sınıf tasarımı ve uygulama örnekleri üzerinden pekiştirmek için birebir Java Özel Ders programı kapsamını inceleyebilirsin.

Sık Sorulan Sorular

Her private alan için getter ve setter yazmak gerekir mi?

Hayır. Alan yalnızca sınıf içinde kullanılıyorsa getter ve setter gerekmeyebilir. Dışarıdan okunacak, ancak doğrudan değiştirilmeyecek bir alan için yalnızca getter yeterli olabilir.

Setter yerine deposit() ve withdraw() gibi davranış metotları ne zaman seçilir?

Değişiklik bir iş kuralına bağlıysa davranış metotları seçilir. deposit() yatırma koşullarını, withdraw() ise çekme ve bakiye kontrolünü aynı yerde uygular.

Constructor doğrulaması neden önemlidir?

Constructor doğrulaması, nesnenin geçersiz bir başlangıç değeriyle oluşturulmasını önlemeye yardımcı olur. Böylece nesne kullanılmaya başlandığında temel durumu daha baştan kontrol edilmiş olur.

Bir sınıfta yalnızca getter bulunması nesneyi değişmez yapar mı?

Hayır. Sınıfın başka metotları alanları değiştirebilir. Ayrıca getter değiştirilebilir bir nesne referansı döndürüyorsa, iç durum dışarıdan dolaylı olarak değiştirilebilir.

Kapsülleme, alanları yalnızca gizlemek değil, nesnenin hangi işlemlerle ve hangi kurallara göre değişeceğini tasarlamaktır.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara