← Back to list

Java 21 OCP Chapter 7 : Sealed Classes

Java’da sealed class’lar, bir sınıfın hangi alt sınıflar tarafından extend edilebileceğini açıkça belirlememizi sağlar. Böylece kalıtım…

Arda Onur · 2025-11-29 16:58 · 0 claps · 2.2 min read
#java #java21 #yazilim
Open on Medium ↗

Java 21 OCP Chapter 7 : Sealed Classes

Java’da sealed class’lar, bir sınıfın hangi alt sınıflar tarafından extend edilebileceğini açıkça belirlememizi sağlar. Böylece kalıtım hiyerarşisini rastgele genişleyen, kontrolsüz bir yapı olmaktan çıkarıp, derleyici tarafından doğrulanan kapalı ve tahmin edilebilir bir modele dönüştürür.

Sealed Class Deklare Etmek

Sealed Class Anahtar kelimeleri

  • sealed: sealed anahtar kelimesi, bir sınıfın yalnızca belirlenen sınıflar tarafından extend edilebilmesini sağlar. Böylece kalıtım zinciri tamamen kontrol altına alınır ve sınıfın dışarıdan rastgele genişletilmesi engellenir.
  • permits: permits, sealed anahtar kelimesiyle birlikte kullanılır ve hangi sınıfların bu sealed sınıfı extend edebileceğini açıkça belirtir. Bu liste compile-time’da doğrulanır; listede olmayan hiçbir sınıf sealed sınıfı extend edemez.
  • non-sealed: non-sealed, bir sealed sınıfı extend eden alt sınıfa uygulanır ve bu alt sınıfın tekrar herkes tarafından extend edilebileceğini ifade eder. Yani sealed sınıf tarafından izin alınır, fakat alt sınıf kendi hiyerarşisini yeniden açabilir.
public sealed class Animal permits Dog, Cat {}

public final class Dog extends Animal {}  

public non-sealed class Cat extends Animal {}

Sealed Classları Compile Etmek

Bir sealed class’ın tüm izin verdiği alt sınıflar (subclasslar) aynı pakette veya aynı module içinde bulunmak zorundadır. Ayrıca permits listesinde belirtilen tüm subclass’lar gerçekten sealed class’ı extend etmek zorundadır. Aksi hâlde derleyici compile-time error üretir.

sealed bir sınıfı doğrudan extend eden her sınıf, mutlaka aşağıdaki üç anahtar kelimeden birine sahip olmalıdır:

  • **final** → Bu sınıf artık daha fazla extend edilemez.
  • **sealed** → Bu sınıf da kendi alt sınıflarını kısıtlayabilir.
  • **non-sealed** → Bu sınıfın extend edilmesi tekrar serbest bırakılır.

Bu üç anahtar kelimeden biri yazılmak zorundadır, aksi hâlde Java derleyicisi compile-time hatası verir.

public sealed class Animal permits Dog, Cat, Bird {}

public final class Dog extends Animal {}       // alt sınıflara izin yok
public sealed class Cat extends Animal permits PersianCat {} // sadece izin verilenler
public non-sealed class Bird extends Animal {} // herkes extend edebilir

Permits Kelimesini Boş Bırakmak

Bir sealed class ile onun alt sınıfları farklı dosyalarda tanımlanıyorsa, Java’nın bu ilişkiyi doğrulaması için permits anahtar kelimesinin mutlaka belirtilmesi gerekir. Aksi hâlde derleyici sealed sınıfın hangi sınıflar tarafından extend edilebileceğini bilemez ve compile-time error üretir.

Ancak şu iki durumda **permits yazmak zorunlu değildir**:

  1. Sealed sınıf ile tüm alt sınıflar aynı dosya içerisinde tanımlanıyorsa (top-level sınıflar olsalar bile tek .java dosyasındalar)
  2. Alt sınıflar sealed sınıfın içindeki “nested class” olarak tanımlanıyorsa

Bu iki durumda Java, sealed sınıfın alt sınıflarını doğrudan görebildiği için permits anahtar kelimesinin açıkça yazılmasına gerek duymaz.

Sealing Interfaces

Sadece sınıflar değil, interface’ler de sealed olabilir. Sealed interface kullanımı aynı mantığı taşır: Interface’i kimlerin implement edebileceğini veya extend edebileceğini açıkça sınırlandırırsın.

Ancak sealed interface’lerde ek bir önemli kural vardır:

Bir sealed interface’i implement eden veya extend eden her sınıf ya da interface, mutlaka final, sealed veya non-sealed anahtar kelimelerinden birini kullanmak zorundadır.

Yani sealed interface’lerde de hiyerarşi kontrolü zorunlu şekilde sürdürülür.

public sealed interface Vehicle permits Car, Electric {}

// final → daha genişletilemez
public final class Car implements Vehicle {}

// sealed → kendi alt interface/sınıflarını yine kısıtlayabilir
public sealed interface Electric extends Vehicle permits Tesla {}

// non-sealed → tekrar herkes implement edebilir
public non-sealed class Tesla implements Electric {}

Sonraki konumuzda “Chapter 7 | Records” konusunu ele alacağız.

Bana ulaşmak isterseniz;

***LinkedIn Github Instagram***


메타데이터
post_id
5ce2eab007d3
slug
java-21-ocp-chapter-7-sealed-classes-5ce2eab007d3
url
https://medium.com/@ardaonur_yazilim/java-21-ocp-chapter-7-sealed-classes-5ce2eab007d3
canonical_url
https://medium.com/@ardaonur_yazilim/java-21-ocp-chapter-7-sealed-classes-5ce2eab007d3
author_url
https://medium.com/@ardaonur_yazilim
status
ok
fetched_at
2026-07-09 13:13:48