Sitemap
2 min readOct 22, 2023

--

Java 17 ile Gelen Önemli Özelliklerden Biri Sealed Class ve Interface

Java’da bir class final anahtar kelimesi kullanılmadığı müddetçe herhangi bir class, o class’tan kalıtım alabilir.

Bu özellik neden önemlidir? Bunu bir soruyla netleştirelim.
Bir class veya interface, kendinden katılım alınabilecek class’ları veya interface’leri sınırlandırabilir mi?

Bu sorunun cevabı Java 17'ye kadar hayırdı.
Java 17 ile gelen sealed class/interface özelliği sayesinde, sorudaki ihtiyacı karşılayabiliriz.

Konunun daha iyi anlaşılabilmesi için bir an önce örneğe geçelim.

Yukarıdaki örnek incelendiğinde Java 17 öncesi kalıtıma örnektir. Shape, Square ve Line sınıflarının her birinden kalıtım alabiliriz.

Yukarıdaki örnek yine Java 17 öncesi kalıtıma örnektir. Shape sınıfı final anahtar kelimesiyle işaretlendiğinden dolayı Shape sınıfından herhangi bir sınıf kalıtım alamaz.

Şimdi gelelim sealed class/interface örneklerine;

Shape sınıfına sealed anahtar kelimesini eklediğimizde Square ve Line sınıfları hata verecektir. Bunun sebebi, bir sınıf sealed anahtar kelimesini kullanıyorsa, kendinden kalıtım alabilecek sınıf(lar)ın ne(ler) olduğunu permits anahtar kelimesini kullanarak yazmalıdır.

sealed anahtar kelimesi kullanılmış Shape sınıfının yanına permits anahtar kelimesini yazıp hangi sınıfların kalıtım alabileceklerini yazdığımızdaki kod çalışır mı? Cevabımız hayır.
Bunun nedeni permits sonrası belirtilmiş Square ve Line sınıflarının başına bir anahtar kelime eklememiz gerekiyor.
Bunlar; final, sealed ve non-sealed anahtar kelimeleridir.

Öncelikle, bu anahtar kelimeleri kısaca açıklayalım.
final: bu sınıftan kalıtım alamazsınız.
non-sealed: bu sınıf Java 17 öncesi bildiğimiz normal bir Java sınıfıdır. Herhangi bir sınıf bu sınıftan kalıtım alabilir.
sealed: bu sınıf aynı Shape sınıfında olduğu gibi kendinden kalıtım alabilecek sınıfları sınırlandırmak zorundadır.

4. satırdaki Square sınıfı Shape sınıfından kalıtım almıştır ve final anahtar kelimesini kullandığı için Square sınıfından kalıtım alınamaz.

7. satırdaki L sınıfı Shape sınıfından kalıtım almıştır ve sealed anahtar kelimesi ile işaretlenmiştir. L sınıfını hangi sınıfların kalıtım alabileceği bilgisini permits ekleyerek yazmalıyız. Örneğimizde LLevelB sınıfını yazdık. Bu sınıfı da 10. satırda tanımladık ve final anahtar kelimesiyle kalıtım alamayacak şekilde belirledik.

13. satırdaki Line sınıfı Shape sınıfından kalıtım almıştır ve non-sealed anahtar kelimesi ile işaretlenmiştir. Bu sınıf Java 17 öncesi bildiğimiz Java sınıfları gibi olduğundan ister hiçbir sınıfı bu sınıftan kalıtım almayın. İsterseniz birden fazla sınıfı bu sınıftan kalıtım alabilirsiniz.

Not-1: sealed anahtar kelimesini permits anahtar kelimesi olmadan kullanamazsınız. Bunun nedeni; eğer bir sınırlama yapmayacaksanız sealed anahtar kelimesini kullanmanın bir anlamı yoktur.

Not-2: sealed interface’lerde olmasına rağmen ondan hiç bahsetmememin nedeni kullanımlarının benzer olmasıdır. Sınıflar ile arasında tek fark, final anahtar kelimesinin sealed interface’lerde olmamasıdır.

Örneğin tamamına github adresimden ulaşabilirsiniz.

İyi günler,
Bol kodlamalar :)

--

--

No responses yet