Java 8'den 21'e — Her Özellik Bir Hata Sınıfı
30 saniyede özet
Java'nın yeni özellikleri sadece yazıyı kısaltmıyor, derleyicinin senin yerine hata yakalamasını sağlıyor. record, sealed ve pattern matching'in her biri bir hata türünü ortadan kaldırıyor.
Java her sürümde yeni özellikler ekliyor ve liste göz korkutabilir. İşin sırrı basit: her özellik bir hatayı imkânsız hâle getiriyor.
-
Bayt: Java her sürümde yeni özellik ekliyor. Bunların hepsini nasıl öğreneceğim?!
-
Sen: Liste gerçekten göz korkutucu.
-
Bayt: Sır şu: her özellik bir hata türünü imkânsız hâle getiriyor.
-
Bayt: Yani ezber yok. Her özelliğin hangi hatayı kapı dışarı ettiğini bil, yeter.
Kendin gör
Java 8 → 21 — aynı sınıf, her sürümde bir hata sınıfı eksiliyor
Tohum 6- ·Lambda, Stream ve OptionalJava 8
- ·var ve değiştirilemez koleksiyonlarList.of → Java 9, var → Java 10
- ·switch ifadesi ve metin bloğuswitch ifadesi → Java 14, metin bloğu → Java 15
- ·recordJava 16
- ·sealed ve switch’te pattern matchingsealed → Java 17, switch’te pattern matching → Java 21
Satır
118
Açık cast
6
Null noktası
5
Değiştirilebilir
4
Elle yazılmış. Alan eklenince güncellenmezse HashMap araması sessizce bozulur.
Yeni bir alt tip sessizce eleniyor — derleyici uyarmaz.
Şu an ne oldu?
Başlangıç — Java 5 tarzı bir sınıf, 118 satır
6 açık cast, 5 null noktası ve derleyicinin doğrulayamadığı bir dal zinciri var. Bunların hiçbiri stil sorunu değil; her biri bir hata sınıfı.
Aklında kalsın: Sürüm özelliklerini liste olarak saymak yerine her birinin hangi hatayı ortadan kaldırdığını söylemek, konuyu gerçekten bildiğini gösterir.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
Aynı sınıf, dört farklı hedef sürümde:
- Java 8. 118 satırdan 100’e. Cast’ler duruyor,
equalselle yazılmış. - Java 17. 38 satır — en büyük tek düşüş
recordaşamasında. Ama cast zinciri hâlâ orada. - Java 21. 30 satır, 0 cast ve sağdaki iki kutu da yeşil.
defaultanahtarını aç. Satır sayısı değişmiyor ama bütünlük denetimi kırmızıya dönüyor.sealed’i kapat. Aynı sonuç, farklı sebeple.
Sağdaki iki kutu dersin özeti: satır sayısı bir ölçüt değil, derleyicinin verdiği garantiler ölçüt.
Her sınıfı record olmaya uygun olup olmadığına göre yerleştir.
record neden değerli?
record Circle(double radius) implements Shape {}Bu tek satır; equals, hashCode, toString, getter’lar ve constructor’ı senin yerine yazar. Ama asıl kazanç yazmaktan kurtulmak değil.
Asıl kazanç şu: alan eklediğinde hepsi otomatik güncellenir. Elle yazılmış bir equals’a alan eklemeyi unutmak, HashMap aramasını sessizce bozar.
Ne zaman kullanılmaz: recordBileşenleri değişmez olan, equals/hashCode/toString'i derleyicinin ürettiği veri taşıyıcısı sınıf.Bileşen eklediğinde equals ve hashCode birlikte güncellenir — elle yazılmış bir equals'a alan eklemeyi unutmak klasik hatadır. Bileşenler final olduğu için record'lar güvenli HashMap anahtarıdır.Sözlükte gör → bir değerdir; değişmez ve alanları aynı olan iki record eşittir, tıpkı iki 5 liralık banknot gibi. Veritabanındaki bir kayıt (JPA entity) ise zamanla değişir ve kimliği id’sindedir, bu yüzden record yapılmaz.
Kafam karıştı, daha basit anlat
record, “bu sadece bir değer” demenin kısa yoludur. Karşılaştırma ve yazdırma kodunu Java yazar. Yeni alan eklediğinde onları güncellemeyi unutamazsın.
Bir `record` senin için hangi üyeleri otomatik üretir?
Derleyici eksik dalı ne zaman yakalar?
sealed, “bu tipin alt türleri yalnızca bunlar” der. pattern matchingBir değerin şeklini sınayıp aynı anda parçalarına ayırmak. `instanceof` ve `switch` ile gelir; tip kontrolü ve cast'i tek adıma indirir.Sözlükte gör → ile birleşince uzun instanceof zincirleri ortadan kalkar:
sealed interface Shape permits Circle, Square {}
double area(Shape shape) { return switch (shape) { case Circle c -> PI * c.radius() * c.radius(); case Square q -> q.side() * q.side(); }; // default yok — ve olmamalı}Buraya Triangle eklersen derleme hatası alırsın. Derleyici seni eksik daldan haberdar eder.
Aynı switch'in sonuna bir de `default -> 0;` eklersen ve sonra Triangle'ı eklersen derleyici seni uyarır mı? Cevabı göster
Hayır. default yeni tipi sessizce yakalar, program derlenir ve Triangle’ın alanı 0 çıkar.
Adım adım oku
- sealed Shape, alt tiplerinin tam listesini derleyiciye bildirir: Circle ve Square.
- Hiyerarşiye yeni bir tip eklenir: Triangle.
- default'u olmayan switch artık derlenmez. Derleyici eksik dalı gösterir.
- default'u olan switch derlenir ve Triangle'ı sessizce yakalar. Alan 0 çıkar, kimse fark etmez.
Garanti iki şartı birden ister:
| sealed | default | Derleyici yeni tipi bulur mu |
|---|---|---|
| ✅ | yok | Evet |
| ✅ | var | Hayır — default onu yutar |
| ❌ | zorunlu | Hayır |
Simülatördeki 16 kombinasyondan yalnızca biri yeşil. default yazmak, sealed’in verdiği garantiyi kendi elinle kapatmaktır.
Aşağıda bir bankanın havale ücretini iki dönemin Java’sıyla hesaplıyoruz. FAST, EFT ve SWIFT için tarife aynı; bak hangisi yeni bir tür eklediğinde seni uyarıyor.
Derinleş · Havale ücreti, iki Java: 8 ve 21 4 dosya · ~67 satır · ilk okumada atlayabilirsin
switch ifadesi.
// deyim: break unutulursa sessizce alt dala düşerswitch (kind) { case "circle": label = "Daire"; case "square": ... }
// ifade: düşmez, değer döndürür, her yol bir değer üretmek zorundadırvar label = switch (kind) { case "circle" -> "Daire"; case "square" -> "Kare"; default -> "Bilinmeyen";};switch deyimi ile switch ifadesi farklı şeylerdir: biri akış kontrolüdür, diğeri bir değer üretir ve derleyici her yolun bir değer döndürdüğünü kontrol eder.
Kafam karıştı, daha basit anlat
sealed derleyiciye bütün alt türlerin listesini verir. Sen bir tür eklediğinde, derleyici o türü unutan her switch’i sana gösterir. default yazarsan bu yardımı kapatırsın.
`sealed` bir arayüz, pattern matching switch'e ne kazandırır?
`sealed` bir arayüz üzerinde pattern matching switch yazdınız ve sonuna `default` eklediniz. Yeni bir alt tip eklendiğinde ne olur?
Dönüş tipleri ve tip çıkarımı
Optional’ın amacı null kontrolünü kısaltmak değil. Amacı “bu metot değer döndürmeyebilir” bilgisini tipe yazmak.
Optional<User> findByEmail(String email); // ✅ sözleşmeyi anlatırİki yaygın yanlış kullanım:
- Alan olarak.
private Optional<String> name;— serialize edilemez, bir katman ekler, hiçbir şey kazandırmaz. - Parametre olarak. Çağıranı
Optional.of(...)sarmalamaya zorlar. Onun yerine metodu aşırı yükle.
Ve opt.get() yazıyorsan Optional’ı kullanmıyorsun demektir — orElse, orElseThrow, map veya ifPresent var.
var.
var users = new ArrayList<User>(); // tip belli, tekrar yazmaya gerek yokvar result = service.process(input); // tip belli değil — okuyucu kaybolurvar derleme zamanında tipi sabitler; hiçbir şey dinamikleşmez. Kural basit: sağ taraf tipi söylüyorsa var kullan, söylemiyorsa yazma.
Kafam karıştı, daha basit anlat
Satırın sağ tarafı tipi zaten söylüyorsa var yaz. Okuyan kişi tipi tahmin etmek zorunda kalacaksa tipi açıkça yaz.
`var` anahtar kelimesi Java'yı dinamik tipli yapar mı?
Hangi sürümde ne geldi
| Sürüm | Özellik | Ortadan kaldırdığı şey |
|---|---|---|
| 8 | Lambda, Stream, Optional | Anonim sınıflar, elle döngü, null dönen aramalar |
| 9 | List.of, Map.of | Dışarı sızan değiştirilebilir koleksiyonlar |
| 10 | var | Tekrarlanan tip bildirimleri |
| 14 | switch ifadesi | Fallthrough hataları |
| 15 | Metin bloğu | Kaçış karakteriyle dolu SQL/JSON |
| 16 | record | Elle yazılmış, senkronu bozulan equals/hashCode |
| 17 | sealed | Bilinmeyen alt tipler |
| 21 | switch’te pattern matching | instanceof + cast zinciri, eksik dallar |
| 21 | Virtual threads | Thread havuzu doygunluğu |
Uzun destekli (LTS) sürümler: 8, 11, 17, 21. Çoğu ekip yalnızca bunlar arasında geçiş yapar, aradaki sürümleri atlar.
Kendini sına
Önce hızlı bir ısınma: puan yok, kayıt yok.
record'ların alanları final'dır; oluşturulduktan sonra değiştirilemez.
Bu kod ne yazdırır?
Aklında kalacak üç şey
- 1 Her yeni özellik bir hatayı ortadan kaldırıyor: record elle yazılan equals'ı, switch ifadesi unutulan break'i, sealed ile pattern matching eksik dalı.
- 2 record'un değeri kısalık değil: equals ve hashCode alanlarla hep uyumlu kalır. Elle yazılmış sınıfta alan eklenip equals unutulunca HashMap sessizce bozulur.
- 3 Derleyicinin eksik dalı yakalaması iki şart ister: sealed bir hiyerarşi ve default'suz bir switch. default yazdığın anda bu yardımı kaybedersin.
5 kart sonraki derste seni bekliyor
Bu dersin üstüne kurulanlar
Bunlar bu dersi temel alıyor; hazır olduğunda devam edebilirsin.