Java'da Kapsülleme (Encapsulation) Nedir? | Getter & Setter + 2025 Örnek Kodlar
Kapsülleme (Encapsulation), bir sınıfın değişkenlerini private yaparak
dış dünyaya doğrudan erişimi kapatmak ve kontrollü erişimi
public getter ve setter metodları üzerinden sağlamaktır.
Bu yaklaşım, sınıfın iç bütünlüğünü korur, hatalı veri girişlerini engeller ve kodun bakımını kolaylaştırır.
İlgili Java İçerikleri (Cluster)
İçindekiler
- Kapsülleme (Encapsulation) Nedir?
- Kötü Kullanım – Public Değişken
- Doğru Kullanım – Private + Getter/Setter
- Getter ve Setter Avantajları
- Lombok ile Daha Temiz Kod
- Record Yapılarında Encapsulation
- Sık Sorulan Sorular
- Sonuç
1) Kapsülleme (Encapsulation) Nedir?
Encapsulation, nesne yönelimli programlamanın (OOP) 4 temel prensibinden biridir:
- Encapsulation (Kapsülleme)
- Inheritance (Kalıtım)
- Polymorphism (Çok Biçimlilik)
- Abstraction (Soyutlama)
Kapsüllemenin temel amacı, sınıfın iç durumunu (state) dış dünyadan korumaktır. Böylece dışarıdan gelişigüzel veri atanması engellenir ve sınıfın kuralları (business rules) tek bir merkezden yönetilir.
2) Kötü Kullanım – Public Değişken (Sakın Yapmayın!)
Alanlar public olursa herkes her değeri atayabilir. Bu da sınıfın bütünlüğünü bozar.
public class Kitap {
public int sayfaSayisi; // Herkes erişebilir!
public String yazar;
}
public class Kutuphane {
public static void main(String[] args) {
Kitap b = new Kitap();
b.sayfaSayisi = -5; // Mantıksız ama derlenir ve çalışır!
System.out.println(b.sayfaSayisi); // -5
}
}
Bu kod “yasal” olabilir ama güvenli değildir. Çünkü sınıfın kuralları devre dışı kalır.
3) Doğru Kullanım – Private + Getter/Setter
Alanları private yaparak dışarıdan erişimi kapatırız. Erişim ve değişiklik için
kontrollü metotlar tanımlarız.
public class Kitap {
private int sayfaSayisi; // Dışarıdan erişilemez
private String yazar;
// Getter
public int getSayfaSayisi() {
return sayfaSayisi;
}
// Setter (doğrulama ekledik)
public void setSayfaSayisi(int sayfaSayisi) {
if (sayfaSayisi < 0) {
throw new IllegalArgumentException("Sayfa sayısı negatif olamaz!");
}
this.sayfaSayisi = sayfaSayisi;
}
public String getYazar() {
return yazar;
}
public void setYazar(String yazar) {
this.yazar = yazar;
}
}
public class Kutuphane {
public static void main(String[] args) {
Kitap b = new Kitap();
b.setSayfaSayisi(150); // Kontrollü atama
// b.setSayfaSayisi(-5); // Exception fırlatır!
System.out.println(b.getSayfaSayisi()); // 150
}
}
Buradaki kritik nokta: Setter içinde validation yazabildiğimiz için sınıfın kurallarını tek yerden yönetiriz. Eğer exception konusunu da pekiştirmek istersen: Java Exception Rehberi
4) Getter ve Setter Kullanmanın 5 Büyük Avantajı
- Doğrulama (Validation): Negatif değer, boş string vb. engellenir.
- İleride mantık ekleyebilme: Log yazma, cache temizleme, event publish etme gibi.
- Refactor esnekliği: Alan adını/temsilini değiştirdiğinde dış API’yı bozmazsın.
- Read-only / Write-only alanlar: Sadece getter ya da sadece setter tanımlayabilirsin.
- Thread-safety ihtiyacı: Gerekirse synchronized ile erişimi kontrol edebilirsin.
5) Lombok ile Daha Temiz Kod (2025’te Standart!)
Lombok, getter/setter gibi tekrar eden kodları otomatik üreterek sınıfı daha okunabilir hale getirir.
Encapsulation bozulmaz; alanlar yine private kalır.
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Kitap {
private int sayfaSayisi;
private String yazar;
// Lombok otomatik olarak getter/setter üretir
// Sadece @Getter koyarak read-only yapabilirsin
}
6) Record’lar Encapsulation Sağlar mı?
Java 16+ ile gelen record yapıları, özellikle DTO benzeri veri taşıma senaryolarında kullanılır.
Record’lar alanları otomatik olarak private final yapar ve erişim metotlarını üretir.
Bu yüzden pratikte encapsulation + immutability sağlar.
public record Kitap(int sayfaSayisi, String yazar) {}
Eğer record’ları bir “veri kontratı” gibi düşünürsen, projede daha az bug ve daha tutarlı state yönetimi elde edersin.
Sık Sorulan Sorular
Java’da kapsülleme (encapsulation) nedir?
Sınıfın iç verisini gizleyip dışarıya kontrollü erişim sağlamaktır. Alanlar private olur; erişim getter/setter ile yönetilir.
Neden doğrudan public değişken kullanmıyoruz?
Çünkü kontrolsüz atamaya yol açar. Sınıfın kuralları devre dışı kalır ve mantıksız değerler sisteme girer.
Lombok @Getter @Setter kullanmak encapsulation bozar mı?
Hayır. Alanlar private kalır; Lombok sadece metot üretir.
Record’lar encapsulation sağlar mı?
Evet. Varsayılan olarak private final alanlar oluşturur ve erişim metotlarını sağlar.
Sonuç
Kapsülleme (encapsulation), Java’da sürdürülebilir ve güvenli yazılım geliştirmenin temelidir. Alanları private yapıp getter/setter üzerinden kontrollü erişim sağlamak; validation, refactor kolaylığı ve tutarlı state yönetimi sunar.